填充如何在结构中工作?
这个程序的输出是28.我不明白怎么办? 据我说,这应该是32(4 + 4 + 4 + 4 + 12)+4(保持对齐)= 32。 请解释显示输出的原因28 ??
struct test{ char c; int d; int x; int y; long double p; }t1; printf("%d",sizeof(t1));
也许你的“long double”实际上与double(8字节)相同,如果你在32位处理器上,则对齐是4字节。
4 + 4 + 4 + 4 + 8 = 24
什么是sizeof(long double)
?
编辑:
我使用GCC的__builtin_offset_of()
和__alignof__
进行调查。 解释结构大小的实际答案是:
4 + 4 + 4 + 4 + 12 = 28
sizeof(long double)
是12。
不需要填充,因为__alignof__(long double)
是4和。 有趣的是, __alignof__(double)
是8。
在64位系统上,字符大小为char – 1字节(不是4字节)int – 4字节长双–12字节
所以总数是1 + 4 + 4 + 4 + 12 +填充= 28个字节!!
据此,gcc 32位模式的长双精度数(使用gcc -m32
或用于产生32位输出的gcc,无论你的平台实际是什么)都只有4字节对齐。 不过,可以参考gcc手册来validation这一点。
这对我来说似乎是对的。 紧跟在p之后的字段将是4字节对齐的,因此在结构的末尾不需要填充。
4 + 4 + 4 + 4 + 12 = 28
在我的系统上,输出是32,但在我的系统上,sizeof(long double)是16.(x86_64,LLVM3)。
28 sizeof
输出当然是正确的= 1字节用于char,3字节填充,3 x 4 int和12字节用于long double(96位大小但80位精度),这使得总共28个字节。
请记住,即使你在x86-64机器上编译,你也许可以使用mingw32为x86-32机器编译,这有所不同。
Mingw32使用4字节的allignement为long double
。