2013-06-18 27 views
4

我想了解POD類型以及它們如何在堆棧中分配和初始化。 鑑於用戶定義的類對象的堆棧分配

class A { 
public: 
    A(); 
    int x; 
}; 

class B { 
public: 
    int x; 
}; 

int func() 
{ 
    A a; 
    B b; 
} 

我是在說B分配之後,但之前的初始化正確?我的意思是 的空間分配爲A和B的順序,他們已宣告但在空間分配,當它被宣佈爲初始化b的初始化 ?

我讀到莢一個很好的常見問題,在這裏彙總 What are Aggregates and PODs and how/why are they special?

之一,他說的話是: 當構造完成非POD類類型的對象的生命週期開始和結束時,析構函數已完成。對於POD類,當對象的存儲被佔用時,生命週期開始,並在釋放或重用存儲時結束。

所以我想了解POD如何分配和初始化的細節以及 與非POD不同的細節。

+0

其實這沒有鏈接,因爲你沒有一個定義爲'A :: A()',如果你做了,'A'不會POD因爲它有一個用戶提供的默認構造函數。 –

+0

是的,它的僞代碼。 B是一個吊艙,A不是。 –

+0

哦,對,我明白了。那麼,在對象被定義之前,生命期不能開始......「獲得存儲」隱含在對象定義中。在此之前內存可能已經存在的事實並不重要。 –

回答

9

a被分配和第一初始化,並且b被分配和第二初始化。 C++程序按語句執行。由於內存是自動,無論如何都沒有明確的分配 - 這一切都是自動處理的。

(例如,在桌面操作系統中使用的典型調用堆棧實現中,內存和一直存在,並不需要在所有被分配,只是解決。)

2

你必須爲零內存中分配A和B的訂單的任何形式的保證。

如果A和B都具有構造函數,一個的會前B的調用。但是你所問的POD類型(以及哪個B)並沒有使用這種語法初始化,所以問題是沒有意義的。

有關對象初始化的時候分配存儲沒有多大意義反正這個問題。例如,這裏的大多數編譯器將在單個堆棧指針移動中爲A和B分配空間。鑑於符合C++程序無法檢測到這樣的事情(它甚至意味着什麼?),編譯器可以做任何它想做的事情。

0

這些是本地變量,它們不是常規的「分配」,你可以考慮它們在那裏。 (如何實現;通常的方法是使用處理器支持的堆棧,在這種情況下,所有本地對象的所有存儲都在函數入口處在堆棧上進行)。

初始化總是發生在聲明的順序。這意味着A :: A()被調用,然後B調用B :: B()。