我正在使用
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
的端上插入更多填充物,以使其大小成为其对齐的倍数。