2016-03-05 15 views
-4
void fun(){ 
    int val2 = 0; 
} 
int main(){ 
    int val1 = 0; 
    fun(); 
} 

if &val1 is 0x7fff55e54a8c&val2會是什麼? 在我的機器上它是0x7fff55e549fc,不應該是0x7fff55e54a880x7fff55e54a90?如果不是,在內存中調用另一個函數時會發生什麼?主函數和其他函數在C++中使用相同的堆棧空間嗎?

+4

這依賴於幾乎你沒有指定一切。 –

+1

你不能依賴這裏的任何東西。如果優化器內聯函數,他們幾乎肯定會共享相同的堆棧空間。真正的問題是,你爲什麼在意?你究竟在做什麼*試圖做什麼? –

+0

C++對你來說是錯誤的語言。你真的想用匯編編寫。 –

回答

1

if &val1 is 0x7fff55e54a8c&val2會是什麼?

在C++標準法規中沒有辦法預測它。

所有的功能共享相同的堆棧空間,除非你有線程局部變量。

對於函數調用,可能會放置堆棧幀操作,因此無法預測實際放置在共享堆棧上的方式的關係。

根據C++標準定義,您可以對某些地址進行假設。

1

每個線程都有一個保留的堆棧空間,在你的情況下,兩個函數都在同一個線程中運行,因此它們都使用相同的堆棧空間。

在windows中,默認情況下使用MSVC,每個線程將爲堆棧分配1MB,現在這就是爲什麼該信息很重要。

void func1(); 
int main() 
{ 
    char abusive_stack_usage[900'000]; 

    // we are about to call func1, and we only have 100kb left to use in the stack. 
    func1(); 
} 

void func1() 
{ 
    // here we use more than 100kb, therefore we get a stackoverflow. 
    char abusive_stack_usage[200'000]; 
} 

在下面的例子我們沒有得到一個計算器

void func1() 
{ 
    //we use 800kb here (available in stack: 200kb) 
    char abusive_stack_usage[800'000]; 

} // we release those 800kb here (available in stack: 1mb) 

void func2() 
{ 
    char abusive_stack_usage[800'000]; 
} 

int main() 
{ 
    // available: 1mb 
    func1(); 

    // available: 1mb 
    func2(); 
} 
相關問題