2014-12-23 73 views
0

在這個網站上有很多關於堆棧&堆的問題。但是我想知道編譯器如何實際管理堆棧?基於堆棧的分配是在運行時還是編譯時決定的? 考慮下面的例子:編譯器如何管理運行時堆棧?

#include <iostream> 
using namespace std; 
class Test { 
// Test class' data members 
public: 
// member functions 
}; 
int main() { 
    Test t; // automatic object 
    // use t here 
    return 0; 
} 

這裏的問題是,當物體T將被分配?內存將在編譯時或運行時分配?我知道當函數終止時,函數被調用&被銷燬時,局部變量,對象被分配。

+11

最後一句話是不是回答你的問題? – Borgleader

+0

「調用函數時分配對象」=>函數運行時... – doctorlove

+0

通常,編譯器不會對堆棧執行任何操作。 –

回答

2

堆棧分配是在編譯時決定,並在運行時執行執行。當編譯器「看到」Test t的聲明時,它會生成代碼以在t的堆棧上分配sizeof(Test)字節,並可選擇調用其ctor。當函數退出時,編譯器會生成代碼來調用dtor(如果存在)並釋放空間。

但是,C99引入了可變長度數組。它們也分配在堆棧上,但是它們的大小在運行時確定。請參閱this

希望這回答你的問題。

0

編譯器決定將運行時分配到堆棧上。

0

它實際上主要取決於系統。編譯器可以估計編譯時需要分配多少內存。

但是,大多是在運行時完成,因爲堆棧使用很難估計,因爲它是代碼相關的,並且可以根據該程序發生在執行代碼路徑上運行之間變化

基於