2010-09-22 2 views
4

У меня есть цикл следующим образомжизни декларации в цикле

while(1) 
{ 
    int i; 
} 

ли i разрушаться и воссоздан в стеке каждый раз, когда происходит цикл?

+0

http://msdn.microsoft.com/en- us/library/b7kfh662% 28VS.80% 29.aspx – DumbCoder

ответ

15

Теоретически, он воссоздан. На практике он может быть сохранен и реконструирован по соображениям оптимизации.

Но с вашей точки зрения, он пересоздался, а компилятор обрабатывает оптимизацию (т.е., держать его в этой сокровенной сфера, до тех пор, как это pod типа).

+0

, так что я должен беспокоиться о проблемах с стеком, если у меня есть несколько таких объявлений в цикле, который выполняется много раз? – aks

+5

совершенно нет. –

+0

Btw Я думал, что вопрос считается оптимизацией –

2

Концептуально, да. Но поскольку ничего не делается для значения, компилятор, скорее всего, генерирует код, ничего не делает с переменной на каждой итерации цикла. Он может, например, заранее распределять его (когда входит функция), так как он будет использоваться позже.

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

4

Не обязательно. Ваш компилятор может изменить его на

int i; 
while(1) { 
    ... 
    i = 0; 
} 

Это может быть не так, чтобы каждый раз создавался и уничтожался в стеке. Однако семантически это то, что происходит, и когда вы используете более сложные типы в C++, которые имеют поведение пользовательской деструкции, это именно то, что происходит, хотя компилятор может по-прежнему выбирать, хранить память стека отдельно.

+4

Откуда берется 'i = 0'? Переменные стека не имеют значений по умолчанию на C или C++. – fredoverflow

+0

Я думал об перезапуске значения i, иначе его семантика разрушения не сохранилась бы, но поскольку я понял, что OP не инициализировал его i, что его значение действительно не определено, и любому компилятору не нужно его вставлять. – Puppy

2

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

То, что вы знаете, что за пределами цикла, вы не можете получить доступ к этому конкретному объекту любым способом (по имени, по указателю на хак, ...)

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