[C++] class / struct成員是否總是按照聲明的順序在內存中創建?


Answers

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

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

看來,這個答案已經過時了C ++。 你每天都能學到東西。 謝謝你,Nemanja。

Question

這是Rob Walker 在這裡的答案引發的一個問題。

假設我像這樣聲明了一個類/結構體:

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

假設這些成員在內存中將按照正確的順序進行聲明是安全的,還是依賴於編譯器呢? 我問,因為我一直認為編譯器可以做任何想做的事情。

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

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

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

相關話題




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




在瀏覽右邊的相關主題的同時,我也看到了這個問題 。 我想這可能是一個有趣的角落案例時,思考這些問題(除非它比我所知道的更普遍)。

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

struct foo{};

並像在C ++中那樣子類化(使用單獨的編譯單元):

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

然後,由於aib提到的原因(甚至在同一個廠商的編譯器之間),內存對齊不一定是相同的。