[c++] 類/結構成員總是按照它們被聲明的順序在內存中創建嗎?



Answers

數據成員按聲明的順序排列。 編譯器可以自由地散佈填充以安排牠喜歡的內存對齊(並且你會發現許多編譯器都有一個對齊規範選項 - 如果混合由不同程序編譯的位,則很有用。)。

另請參見為什麼GCC不優化結構?

對於C ++來說,這個答案似乎有點過時了。 你每天都學到東西。 謝謝aib,Nemanja。

Question

這是Rob Walker here回答的here

假設我聲明一個類/結構,如下所示:

struct
{ 
    char A;
    int B;
    char C;
    int D;
};

是否可以安全地假設這些成員將在內存中以完全相同的順序聲明,或者這是編譯器相關的東西? 我問,因為我一直認為編譯器可以用它們做任何想做的事情。

這導致我的下一個問題。 如果上面的例子導致內存對齊問題,為什麼編譯器不能只是隱式地將它變成這樣的東西:

struct
{ 
    char A;
    char C;
    int B;
    int D;
};

(我主要是詢問C ++,但我也有興趣聽到C答案)

相關話題




在瀏覽右邊的相關主題時,我看了這個問題 。 我認為在考慮這些問題時這可能是一個有趣的角落情況(除非它比我意識到的更常見)。

換句話說,如果你在C中有一個看起來像這樣的結構:

struct foo{};

並在C ++中使用它(使用單獨的編譯單元)將其子類化:

extern "C" foo;
struct bar: public foo{};

然後,由於aib提到的原因(即使是來自同一供應商的編譯器),內存對齊也不一定相同。




我不能說C ++,但在C中,順序保證與結構中聲明的內存順序相同。




Links