4

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

5 回答 5

5

也许您的“长双精度”实际上与双精度(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。

于 2012-05-24T18:57:50.037 回答
1

在 64 位系统上,大小为 char - 1 字节(不是 4 字节) int - 4 字节长 double - 12 字节

所以总共是 1+4+4+4+12+padding = 28 字节!!

于 2012-05-24T19:44:38.987 回答
1

据此,gcc 32 位模式下的长双精度数(使用gcc -m32与生成 32 位输出的 gcc 一起使用,无论您的平台实际是什么)仅 4 字节对齐。不过,查阅 gcc 手册以验证这一点可能会很好。

于 2012-05-24T20:01:58.043 回答
0

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

4+4+4+4+12=28

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

于 2012-05-24T20:52:32.573 回答
0

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

请记住,即使您在 x86-64 机器上编译,您也可能使用 mingw32 为 x86-32 机器编译,这会有所不同。

Mingw32 对long double.

于 2012-05-24T20:53:48.933 回答