2011-02-24 2 views
4

Что более эффективно?Объявление массива до или внутри цикла

Объявление массива, например. char buffer [4096] перед циклом и в каждой итерации очистить его содержимое strlcpy или объявить массив внутри цикла с начальным значением «»?

char buffer[4096] = ""; 
while(sth) 
{ 
    strlcpy(buffer,"",sizeof(buffer)); 
    //some action; 
} 

против

while(sth) 
{ 
    char buffer[4096] = ""; 
    //some action; 
} 
+0

* «Что более эффективно?» * - «Эффективно» в каком отношении? –

+0

Я не думаю, что существует слишком большая разница между –

ответ

3

Там, наверное, нет существенной разницы между ними. Единственный способ убедиться в том, что это будет сравнение или просмотр сборки, сгенерированной компилятором.

Второй пример более ясен и был бы предпочтительнее.

3

Также нет причин для очистки всего буфера, если он просто используется в качестве строкового буфера. Все, что вам нужно сделать, это убедиться, что в конец соответствующей строки добавлен байт NUL \0.

Если вы хотите, чтобы функции str * начинались в начале buffer, простое *buffer = '\0' - это все, что необходимо по указанной выше причине.

0

Цитирую Кнут, "We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil."

Фокус на читаемость. Оптимизируйте, когда вам нужно.

+0

-1 Цитата правильно пожалуйста. Вы избавились от самой важной части этой цитаты! – alternative

+0

Выполнено со ссылками. :) – Davidann

1

Единственная возможная разница в производительности является назначение в буфер, и это, вероятно, переводится компилятором в одном операторе, который будет идентичен этому:

*buffer = 0; 

Составители не будет выполнять любое управление стеком когда вы входите в цикл. Независимо от того, задаете ли вы буфер внутри или вне цикла, не имеет никакого значения для стека. Место для буфера будет зарезервировано в стеке в начале процедуры независимо от того, где вы определяете свою буферную переменную (что не означает, что компилятор позволит вам получить доступ к буферу за пределами области, где он определен).

Даже одно задание, показанное выше, вероятно, будет оптимизировано вашим компилятором, если оно увидит, что не имеет смысла повторно инициализировать буфер каждый раз снова и снова.

0

Предлагаю первую версию. В первой версии массив выделяется только один раз. Во второй версии массив выделяется каждой итерацией цикла.

Хотя компиляторы могут оптимизировать распределение (например, выполнять только один раз), я считаю, что его факторинг указывает читателю, что память выделяется только один раз.

Это может быть не о чем беспокоиться, поскольку многие платформы выделяют в стеке, а распределение состоит из изменения содержимого указателя стека.

В случае сомнений профиль.

При рассмотрении оптимизаций не требуется. Проведите время, делая программу правильной и надежной.

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