簡體   English   中英

循環中聲明的生命周期

[英]lifetime of declaration within a loop

我有一個循環如下

while(1)
{
    int i;
}

每次循環發生時, i是否會在堆棧中被銷毀並重新創建?

從理論上講,它會被重新創建。 在實踐中,出於優化原因,它可能會保持活力並重新煥發活力。

但是從你的角度來看, 它會被重新創建 ,並且編譯器會處理優化(即,只要它是pod類型,就將它保持在最里面的范圍內)。

不必要。 您的編譯器可以選擇將其更改為

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

它可能不是每次都在堆棧上逐字創建和銷毀。 但是,從語義上講,就是這種情況,當你在C ++中使用具有自定義銷毀行為的更復雜類型時,這正是發生的事情,盡管編譯器仍然可以選擇單獨保存堆棧內存。

從概念上講,是的。 但是由於沒有對值進行任何操作,編譯器很可能在循環的每次迭代中生成代碼並不對變量執行任何操作。 例如,它可以提前分配(當函數進入時),因為它將在以后使用。

由於您無法在定義范圍之外引用變量,因此不會更改語義。

C您必須查看生成的程序集以了解( 編譯器可能已選擇將其放入寄存器中 )。

你知道的是,在循環外你無法通過任何方式訪問該特定對象(通過名稱,指針,黑客,...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM