1

Рассмотрим следующий код, чтобы отфильтровать тире префиксом аргументы:Должен ли я считать требуемый объем памяти перед распределением?

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), без дополнительного ограничения скорости)
+2

Захватывание всех аргументов - очень мучительная задача для людей, но не машины, стоит того, чтобы избежать неприятных сюрпризов. – milevyo

+4

Попытка оптимизировать здесь бессмысленно, так как это, конечно же, не является узким местом в вашей программе. –

+1

для удобства обслуживания и чтения, вы можете переместить код на новую функцию (или макросы) и называть ее дважды. – milevyo

ответ

1

ИМХО, вы не указали количество аргументов, которые вы ожидаете. Это, конечно, не будет узким местом, если вы ожидаете аргументов в количестве тысяч. Помните, что машина выполняет эту работу, а не вы.

Выделение и перераспределение менее эффективно, чем два цикла в этом случае. Также, если вы боитесь двойных циклов, вы всегда можете выделить flags=malloc(argc).

Шармы дешевые. Я бы сделал что-то подобное,

flag = malloc(argc); 
//your code 
if(argv[i][0]=='-') 
flags[j++] = argv[i][1]; 

Почему? Сохраняет мне две петли и половину сравнения. :)

-2

Это не проверено - но что-то подобное беременеет!

int main(int argc, char* argv[]) { 
    int i; 
    int j; 
    int flags_len; 
    char* flags; 

    flags_len = 0; 
    for (i=1; i < argc; i++) { 
     if (argv[i][0] == '-') { 
      flags = (char*) malloc((1 + flags_len)*sizeof(char)); 
      flags[flags_len] = argv[i][1]; 
      flags_len++; 
     } 
    } 
    free(flags); 
    return 0; 
} 
+4

И что происходит со старым флагом, когда вы вызываете 'malloc' второй раз? Как вы освобождаете предыдущую память? –

+0

Я думал об использовании 'realloc' вместо этого, да. Мне просто интересно, какой будет лучший метод для программы общего назначения. – YoYoYonnY

Смежные вопросы