这个程序的输出是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));
这个程序的输出是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));
也许您的“长双精度”实际上与双精度(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 字节长 double - 12 字节
所以总共是 1+4+4+4+12+padding = 28 字节!!
据此,gcc 32 位模式下的长双精度数(使用或gcc -m32
与生成 32 位输出的 gcc 一起使用,无论您的平台实际是什么)仅 4 字节对齐。不过,查阅 gcc 手册以验证这一点可能会很好。
这对我来说似乎是正确的。紧跟在 p 之后的字段将是 4 字节对齐的,因此不需要在结构的末尾进行填充。
4+4+4+4+12=28
在我的系统上,输出是 32,但在我的系统上,sizeof(long double) 是 16。(x86_64,LLVM3)。
28sizeof
输出当然是正确的 = 1 字节用于 char,3 字节填充,3 x 4 int 和 12 字节用于 long double(96 位大小但 80 位精度),总共 28 个字节。
请记住,即使您在 x86-64 机器上编译,您也可能使用 mingw32 为 x86-32 机器编译,这会有所不同。
Mingw32 对long double
.