簡體   English   中英

C編程:結構填充

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM