Рассмотрим следующий код, чтобы отфильтровать тире префиксом аргументы:Должен ли я считать требуемый объем памяти перед распределением?
int main(int argc, char* argv[]) {
int i;
int j;
size_t flags_len;
char* flags;
flags_len = 0;
for (i=1; i < argc; i++) {
if (argv[i][0] == '-') {
flags_len++;
}
}
flags = malloc(flags_len);
j = 0;
for (i=1; i < argc; i++) {
if (argv[i][0] == '-') {
flags[j++] = argv[i][1];
}
}
return 0;
}
Стоит ли зацикливание на все аргументы, дважды просто подсчитать количество флагов?
Было бы целесообразно сохранять позиции фильтрованных элементов при этом?
Будет ли это стоить, если мы планируем выделить много памяти?
Какой вариант был бы оптимальным в целом? (Что такое «лучшая практика»)?
- Подсчета перед выделением (
1
вызоваmalloc
, большой speedloss) - расПредеЛения буфера (
floor(n/buffersize) + 1
вызовы кmalloc
(илиrealloc
), малому speedloss) - расПредеЛения, когда это необходимо (
n
вызововmalloc
(илиrealloc
), без дополнительного ограничения скорости)
Захватывание всех аргументов - очень мучительная задача для людей, но не машины, стоит того, чтобы избежать неприятных сюрпризов. – milevyo
Попытка оптимизировать здесь бессмысленно, так как это, конечно же, не является узким местом в вашей программе. –
для удобства обслуживания и чтения, вы можете переместить код на новую функцию (или макросы) и называть ее дважды. – milevyo