2014-03-06 55 views
0

例如:將堆棧內存不足的功能塊來重用

void test(bool aFlag) 
{ 
    if(aFlag) 
    { 
    int temp =1; 
    //do something 
    } 
    else 
    { 
    int temp =2; 
    //do something 
    } 

    int aaaa =0; 
} 

外出時的if/else塊的,臨時的內存不再使用, 將AAAA重用臨時的內存?如果會,何時以及在什麼條件下? 或者將會在函數的後面覆蓋'temp'的地址。

+0

假設目標C具有相同的內存模型下吊艙,也不能保證,這將是相同的地址。但在實踐中,是的,'temp','temp'和'aaaa'將是相同的地址。如果你真的想知道,只是'NSLog(「%p」,&temp);'和'aaaa'。 – Corbin

回答

0

這取決於編譯器。該語言不保證有關變量存儲位置的任何信息。但是,編譯器通常會生成類似的代碼,是的。

+0

是的,它取決於編譯器; 但我想知道在什麼情況下編譯器會生成這樣的代碼,哪個優化級別? 換句話說,我想讓temp和aaaa擁有相同的地址,或者讓它們的地址重疊。 – jerui

0

如果是C,那麼你就不能創建代碼後變量。所以,我假設aaaa和temp會有不同的地址,特別是在調試模式下(而且它們確實有)。但是在發行版中,編譯器會優化代碼,並且無法預測行爲(還有分支預測,向量化和其他cpu功能,並且它可以使用寄存器而不是局部變量等)。使用volatile來使它們不同並將它們聲明在函數的頂部。 通常情況下,當你進入它的功能爲局部變量和本地存儲分配空間,所以

aaa is like dword ptr [aaaa],0 
temp 1 is like dword ptr [ebp-14h],1 
temp 2 is like dword ptr [ebp-20h],2