[英]C programming : padding in structure
我在用
processor architecture: x86_64
OS : Debian GNU/Linux 9 (stretch) 64-bit
GCC compiler ver. : 6.3.0
如果我編譯這段代碼-
struct test {char a; int b;}
test;
printf("%ld", sizeof(test);
那么輸出是-8我認為是因為4字節填充,我的意思是1 + 3 + 4現在我嘗試了此代碼-
struct test{char a; double b;}
test;
這給了我16個字節,那么我想,可能是因為8個字節的填充,即-當我嘗試此代碼時-1 + 7 + 8-
struct test{char a; long double b; char c;}
test;
這給了我48個字節
在我使用gcc的系統中,int = 4字節,double = 8字節,char = 1字節,long double = 16字節。
我的問題是這如何工作? 為什么不統一填充?
您使用第三個結構更改了模式。 如果您使用第三個結構,那么您將獲得與前兩個模式一致的數字:
struct A { char a; int b; }; // 1 + 3 + 4 = 8
struct B { char a; double b; }; // 1 + 7 + 8 = 16
struct C { char a; long double b; }; // 1 + 15 + 16 = 32
現在,當您在long double
后面放置另一個char
時,您只需要再一個字節,但是編譯器會添加另外15個字節的填充:
struct D { char a; long double b; char c; }; // 1 + 15 + 16 + 1 + 15?!
我認為您真正要問的問題是,為什么要這樣做? 這樣做是因為數組。 C標准說,數組元素之間絕不能有任何填充。 但是,為了使內部填充能夠將b
正確對齊為16個字節, struct D
本身必須對齊為16個字節。 如果struct D
為33個字節長,則數組struct D dee[2]
的第二個元素將未對齊。 因此,編譯器必須在struct D
的末尾插入更多填充,以使其大小成為其對齊方式的倍數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.