2015-05-10 3 views
0

Рассмотрим следующем циклеОбъявление переменных внутри цикла

for(int i = 0; i < 99999999; i++) 
{ 
    double d1 = (double)i/10; 
    double d2 = (double)i/100; 

    std::cout << d1 * d2 << std::endl; 
} 

Из того, что я знаю, приложение будет выделять и свободные 16 байтов памяти в стеке (двойной 8 байт на моей машине) для каждой итерации в петле. Это правда, или компиляторы достаточно умны, чтобы знать, освободить память только тогда, когда цикл заканчивается?

Дело в том, что объявление переменной внутри цикла делает код более читаемым (imo).

+1

Я думаю, это достаточно умно. – Maroun

+3

Вы понимаете, что «выделение» памяти в стеке просто перемещает указатель стека процессора, правильно? Но да, компилятор почти наверняка выполняет единую настройку стека для всего, а не за итерацию. Проверьте вывод ассемблера. –

+0

Вы можете добавить статический. Это гарантирует, что они будут выделены один раз. –

ответ

3

Распределение стеков - это не что иное, как увеличение и уменьшение значения регистра.

Даже если компилятор является немым, это означает, что для каждой итерации выполняется не более 1 ADD и 1 команда SUB. В любом случае это маловероятно, поскольку компилятор знает, что они являются локальными в цикле и что они не могут изменить свой размер.

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

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