C编程:结构填充



我正在使用

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字节,长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上插入更多填充物,以使其大小成为其对齐的倍数。

最新更新