在下面的結構,我覺得大小應該是20,但它出來是24的sizeof結構不清晰,即使填充
class X {
unsigned int a;
unsigned int b;
double c;
unsigned int d;
};
爲什麼不能編譯器16-安排d
20字節?
在下面的結構,我覺得大小應該是20,但它出來是24的sizeof結構不清晰,即使填充
class X {
unsigned int a;
unsigned int b;
double c;
unsigned int d;
};
爲什麼不能編譯器16-安排d
20字節?
這使得c
保持在X
陣列的8字節邊界上對齊。
X x[2];
X[0]:
0-3 unsigned int a
4-7 unsigned int b
8-15 double c
16-19 unsigned int d
20-23 [PAD]
X[1]:
24-27 unsigned int a
28-31 unsigned int b
32-39 double c
40-43 unsigned int d
44-47 [PAD]
因此,你可以看到你需要4個字節的數組元素之間的墊。這是通過在對象的末尾添加4個字節來捕獲的。如果第二個數組元素從位置20
開始,那麼您會發現x[1].c
不是8字節對齊的。
因此,最後,d
確實從字節16開始,如您所料,但d
的結尾不是對象的結尾。
好吧..謝謝有什麼辦法可以使大小20爲同一個結構? – user3651312
請參閱進一步的編輯說明。 – Keith
不,如果您的意思是「我可以重新訂購以減少存儲空間」,我不知道如何。 – Keith
在POD結構這樣的,struct
的地址是它的第一個元件的地址。大小是類型爲X[]
的數組的連續元素之間的存儲器中的距離。對於double
在一個假設的陣列的第二元件對準,所述第一int
和整個struct
必須對準到相同的嚴格性爲double
。這最後需要填充。
在哪個平臺上運行?在我的Ubuntu機器上它只給我輸出20! 的sizeof unsigned int類型是4和雙是8和這就是爲什麼輸出是20 我的機器上! 這從硬件到硬件有所不同!
你的公式是什麼? – user2485710
你需要指定你的環境 – tristan