C中结构的大小; GCC与实际计算

时间:2016-12-12 03:53:38

标签: c struct padding

根据c_faq

typedef struct  {
    char a[3];
    short int b;
    long int c;
    char d[3];
} T;

sizeof(T)将在 32位gcc编译器上返回 16 。因为对齐是4,所以要计算,我应该这样做:3+(1)+2+(2)+4+3+(1),其中括号代表填充。海湾合作委员会同意。

基于这个逻辑,我已经用另一个问题自己做了一些练习。

typedef struct{
    char buf1[9];
    unsigned short s;
    double d;
    char buf2[3];
} S;

sizeof(S)应该在 32位gcc编译器上返回 32 。因为对齐是8,所以要计算,我应该这样做:8+1+2+(5)+8+3+(5)。但是,gcc告诉我sizeof(S)是24。

我认为这是因为优化,然而,在gcc中弄乱-O0标志后,sizeof(S)仍然会导致24。

这里发生了什么?

我正在使用此gcc -m32 main.c进行编译。

先谢谢!

编辑:所以,如果我理解正确,我的计算和GCC的计算不匹配的原因是因为每个编译器都有自己的处理结构数据的方式。那么计算结构大小的通用方法是什么?或者更确切地说,计算结构大小的原始方法是什么?

2 个答案:

答案 0 :(得分:4)

  

那么计算结构大小的通用方法是什么?或者更确切地说,计算结构大小的原始方法是什么?

没有通用的方法。也没有一种真正的“原创”方式,因为C是在20世纪70年代创建的,当时PDP-11是一种东西,而C直到1989年才正式指定。它的实现是定义的,并且因平台而异(我这不仅仅是轻率的;它确实在平台和实现之间确实存在差异(甚至是编译器标志!)。

如果您的教授希望您计算结构的大小,那么他或她必须提供每种数据类型所需的对齐方式。如果他们不这样做,那么他们的问题是不明确的(并且几乎无数的不同答案可以被辩护为“正确”)。

答案 1 :(得分:0)

我制作了以下代码来检查结构中每个元素的地址。

#include <stdio.h>

typedef struct{
    char buf1[9];
    unsigned short s;
    double d;
    char buf2[3];
} S;

int  main()
{
    S S1;
    S *Sptr = &S1;
    printf ("\n sizeof (S) is %d",sizeof(S));
    printf ("\n Buf1 --> %d",(char*) &(Sptr->buf1[0]) - (char*)Sptr);
    printf ("\n s    --> %d",(char*) &(Sptr->s) - (char*)Sptr);
    printf ("\n d    --> %d",(char*) &(Sptr->d) - (char*)Sptr);
    printf ("\n Buf2 --> %d",(char*) &(Sptr->buf2[0]) - (char*)Sptr);
    return 0;
}

我的编译器(cygwin 64位)的结果是

sizeof (S) is 32
Buf1 --> 0
s    --> 10
d    --> 16
Buf2 --> 24

short在字节10处,因此它在2字节边界上对齐。双精度为16米,并以8字节边界对齐。最后的结构也填充为8个字节。