C中不需要sizeof结构,因为编译器未添加填充

C中不需要sizeof结构,因为编译器未添加填充,c,struct,sizeof,C,Struct,Sizeof,首先,关于我的问题,我尝试遍历stackoverflow中的现有线程。至少,我找不到一条谈论我的问题的线索。 我正在通过执行32位机器的以下代码 gcc -m32 -o size32 size.c 相反,我发现编译器没有添加额外的填充。我没有添加属性标志。因此,我希望编译器填充额外的字节。这是我的问题 struct s{ char c; int i; double d; void *p; }; struct s temp; void *q;

首先,关于我的问题,我尝试遍历stackoverflow中的现有线程。至少,我找不到一条谈论我的问题的线索。 我正在通过执行32位机器的以下代码

gcc -m32 -o size32 size.c
相反,我发现编译器没有添加额外的填充。我没有添加属性标志。因此,我希望编译器填充额外的字节。这是我的问题

struct s{
    char c;
    int i;
    double d;
    void *p;
};

    struct s temp;
    void *q;
    double d1=10;

    printf("size of struct = %d sizeof q = %d sizeof double = %d\n",sizeof(temp),sizeof(q),sizeof(d1));
输出是 结构的大小=20sizeof q=4sizeof double=8

这是我的计算。char(1字节)+3字节padding+int(4字节)+double(8字节)+(void*)(4字节),由于最长的成员对齐规则(此处double为8字节,因此结构应在8字节边界上对齐),最终总计为24字节。所以总大小应该是24字节。为什么它只显示20个字节

谢谢


Chid

在Linux上,除非将
-malign double
传递给编译器,否则double只在4字节边界对齐,因此结构不需要额外的填充


请参阅文档。

double只需4字节对齐,即使大小为8字节。在linux上,它是4字节对齐的,8字节带恶意双编译时选项。我怀疑这是否适用于一般linux;我希望它取决于目标CPU和它的ABI。是的,有关double何时与8字节对齐的完整讨论,请参阅。