2015-05-10 284 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

你意識到在堆棧上「分配」內存只是移動CPU的堆棧指針,對吧?但是,是的,編譯器幾乎可以肯定地爲整個事情執行一次堆棧調整,而不是每次迭代。檢查彙編器輸出是否確定。 –

+0

您可以添加靜態。這將保證他們將被分配一次。 –

回答

3

堆棧分配無非是增加和減少寄存器的值。

即使編譯器是愚蠢的,這意味着每次迭代最多執行1次ADD和1個SUB指令。這在任何情況下都是不可能的,因爲編譯器知道它們是循環中的局部變量,並且它們不能改變它們的大小。

實際上它們也可能不能保持在堆棧上,因爲它們可能適合整個循環的兩個浮點寄存器。