编译器对命名结构的重新排序

时间:2018-08-16 03:13:00

标签: c++ c

struct unaming
{
    char f;
    double dd;

    struct 
    {
    int data;
    char c;
    double d;
    };
};

我期望此结构的大小为40个字节。但是编译器返回了32个字节。 我期待着以下布局。

[char f] [7字节] [double dd] [int数据] [4字节] [char c] [7bytes] [double d] = 40

这是基于以下规则:结构及其成员变量将与当前存在的最大数据类型对齐。

但是看起来编译器重新排列了未修饰的结构。是这样吗为什么是32个字节?

1 个答案:

答案 0 :(得分:6)

规则不是每个结构构件都必须根据结构中构件的最大对齐要求进行对齐。规则是每个成员必须根据自己的对齐要求进行对齐。

对于您的结构,假设charintdouble的大小分别为1、4和8个字节,并假定其对齐要求也为1、4和8个字节,典型的C实现中的布局为:

  • char f的偏移量为0。
  • 填充7个字节可将偏移量设置为double所需的8。
  • double dd位于偏移量8。
  • struct从偏移量16开始。
  • int data位于偏移量16。
  • char c位于偏移量20。
  • double所需的三个填充字节使offset达到24。
  • double d位于偏移量24。

这使得总大小为32个字节。由于这是八的倍数,因此最后不需要填充。 (由于结构可以在数组中使用,因此结构的总大小必须是其对齐要求的倍数,以便数组中的后续结构可以位于所需的对齐边界上。)