内部结构的拖尾填充

时间:2015-04-02 08:46:54

标签: c language-lawyer

编译器通常在结构上插入尾部填充以满足对齐 在数组中使用时的限制:

// Size 4, alignment 2
struct A {
    uint16_t x;
    uint8_t y;
    // Padding 1 byte
};

// Size 6, alignment 2
struct B {
    struct A xy;
    uint8_t z;
    // Padding 1 byte
};

现在考虑使用内部结构组合这些:

struct AB {
    struct {
        uint16_t x;
        uint8_t y;
    } xy;
    uint8_t z;
};

以下可以适合4个字节,同时不会破坏对齐限制。 此外,内部结构xy没有可以在别处使用的类型,所以 不需要尾随填充。

缺点是成员xystruct A不兼容,但在那里 没有理由说它们应该是因为它们的类型定义不同。

是否允许编译器执行此大小优化?

或者,换句话说,标准是否要求具有相同成员的2个结构总是会产生相同的布局?

1 个答案:

答案 0 :(得分:1)

兼容类型的概念可能给出了答案。如果t1t2是兼容类型,则可以使用指向t1的指针来访问使用类型t2设置的内存。

在C11标准中:

  

6.2.7兼容类型和复合类型

     
      
  1. ...此外,如果其标签和成员满足以下要求,则在单独的翻译单元中声明的两个结构,联合或枚举类型是兼容的:如果使用标记声明一个,则应使用相同的声明声明另一个标签即可。如果两者都在其各自的翻译单元内的任何地方完成,则以下附加要求适用:其成员之间应存在一对一的对应关系,以便每对相应的成员被宣布为兼容类型;如果使用对齐说明符声明该对中的一个成员,则使用等效的对齐说明符声明另一个成员;如果该对的一个成员使用名称声明,则另一个成员使用相同的名称声明。 ...
  2.   

两个没有相同标签的结构是不兼容的类型,我没有看到任何强迫它们具有相同布局的结构。