为什么结构填充没有正确发生?

时间:2015-04-25 05:44:26

标签: c padding

#include<stdio.h>

struct A
{
    char        c;
    double      e;
    int         s;
}A;

int main()
{
    printf("%u\n", sizeof(A));
    return 0;
}

输出 16 。如果我们考虑结构内部填充和结构填充作为一个整体,不应该 24 吗?

我正在使用 GCC 4.8.2 编译 Ubuntu 14.04 32位上的代码。

1 个答案:

答案 0 :(得分:12)

您的计算假设double需要8字节对齐。所有架构都不是这样。

在具有GCC的32位x86 Linux上,double默认为4字节对齐。您可以使用-malign-double标志更改它,使其与8字节对齐。

因此布局假定默认为32位x86 Linux:

char       // 1 byte
           // 3 byte padding
double     // 8 bytes
int        // 4 bytes

总共16个字节,中间有3个字节的填充。

维基百科文章Data structure alignment在一些编译器/环境中的32位x86和64位x86_64上有各种类型的大小/对齐号。