[英]Why the Struct padding is same in 64 bit and 32 bit systems?
在 inte.net 上花了很多時間尋找答案后,我什么也沒得到。
我的問題是:我有一個 64 位系統,當我運行這段代碼時:
#include<iostream>
using std::cout;
class A
{
char a ; //1
char b ; //1
int c; //4
int d; //4
};
int main()
{
A a1;
cout<<sizeof(a1);
return 0;
}
output 是 12,而不是 16。為什么?
在使用的系統中sizeof( int )
等於4
。 因此,為了對齊數據成員c
,編譯器在變量b
之后填充2
個字節。 因此,該結構的大小為 12 字節。
如果您聲明數據成員c
和d
具有long
類型,您可以獲得更明顯的結果,具體取決於使用的是32
位系統還是64
位系統。 在大多數 64 位系統中, sizeof( long )
等於8
。
當需要填充字節來滿足任何這些數據成員的 alignment 要求或(更一般地)優化對這些成員的訪問速度時,在結構或 class 的數據成員之間添加填充字節。
現在,雖然int
標准未指定 alignment 類型的要求,但同一底層芯片(例如 Intel x86-64 系統)的 32 位和 64 位構建之間可能會有所不同(或不變) ), alignment 對char
類型(以及signed char
和unsigned char
)的要求由標准指定! 來自cppreference :
最弱的alignment(要求最小的alignment)是
char
、signed char
、unsigned char
的alignment,等於1; 任何類型的最大基本 alignment 是實現定義的,等於std::max_align_t
(C++11 起)的 alignment。
因此,由於b
成員的 alignment 要求為 1,因此a
和b
之間不需要填充。 在您的情況下, alignment 對int
的要求是 4 個字節,因此必須在c
成員之前添加兩個填充字節。 因此,2 × sizeof(char)
(= 2) + 2 個填充字節 + 2 × sizeof(int)
(=8) 給出了 12 個字節的總大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.