2017-08-07 142 views
0

正如我們所知道的那樣,結構的內存在其變量被定義時(或者在創建實例時)被分配。C++中的結構內存分配

現在

struct Programmer { 
int skills; 
int problemSolved; 
}; 

int main(){ 
Programmer me;//Here the memory will be allocated but in what 
       //format(discrete or continuous block of memory)? 
me.skills = 10; 
me.problemSolved = 2000; 
return 0; 
} 

是對存儲器分配給結構實例或變量是連續的塊(如陣列)或在存儲器離散塊?如果是,那麼爲什麼?

+2

是的,但請記住有填充(並非總是)。 – DimChtz

+0

所有你可以在結構中保證的是,成員將按照它們被聲明的順序進行分配。允許編譯器插入「填充」字節,作爲對齊目的的示例。 –

+0

@ ThomasMatthews--還有一個保證,在'struct'開頭不會有填充。 –

回答

2

分配給struct的內存是連續的。從C11草案標準的§6.2.5 ¶20

的結構式描述了一種順序地分配非空集合 成員對象的....

但是,可能存在分配用於struct存儲內填充根據§6.7.2.1 ¶15

有可能是一個結構對象內無名填充,但不是在其 開始。

而且,從6.7.2.1 ¶17

可以存在在結構或聯合的端無名填充。

+0

是的,我也可以通過#pragma pack避免填充,btw謝謝:-) –

2

該結構被分配在堆棧上,在一個連續的內存塊(在這種情況下可能是64位)。它在函數被調用時被分配(除非你的編譯器做了一些棘手的事情)。

所有實例變量都在堆棧中分配(雖然沒有指定它們如何在標準中分配,這是所有編譯器如何實現的)。原因是,當你遞歸地調用一個函數時,它會得到一個新的棧幀來獲得更多的變量。這樣,如果你在棧上有一個變量「me」,並且你在main()中調用了main(),那麼你會在第二個棧幀中得到第二個「me」變量。當第二個「main()」返回時,堆棧幀將被釋放以用於未來的其他呼叫。

+3

提醒:變量不需要位於堆棧上。沒有對堆棧的要求。 –

+0

同意。 (a)沒有在標準中指定,(b)編譯器優化可以將其刪除或放在其他地方 – Jordan