填充如何在结构中工作?

时间:2012-05-24 18:54:13

标签: c

这个程序的输出是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));

5 个答案:

答案 0 :(得分:5)

也许你的“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。

答案 1 :(得分:1)

在64位系统上是 char - 1个字节(不是4个字节) int - 4个字节 long double - 12个字节

所以总数为1 + 4 + 4 + 4 + 12 +填充= 28字节!!

答案 2 :(得分:1)

根据this,gcc 32位模式中的长双精度数(使用gcc -m32或生成32位输出的gcc,无论你的平台实际是什么)都只是4字节对齐。不过,可以参考gcc手册来验证这一点。

答案 3 :(得分:0)

这对我来说似乎是对的。紧跟在p之后的字段将是4字节对齐的,因此在结构的末尾不需要填充。

4 + 4 + 4 + 4 + 12 = 28

在我的系统上,输出为32,但在我的系统上,sizeof(long double)为16.(x86_64,LLVM3)。

答案 4 :(得分:0)

28 sizeof输出当然是正确的= 1字节用于char,3字节填充,3 x 4 int和12字节用于long double(96位大小但80位精度),这使得总共28字节。

请记住,即使你在x86-64机器上编译,你也许可以使用mingw32为x86-32机器编译,这会产生影响。

Mingw32对long double使用4字节的allignement。