编译器通常在结构上插入尾部填充以满足对齐 在数组中使用时的限制:
// 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
没有可以在别处使用的类型,所以
不需要尾随填充。
缺点是成员xy
与struct A
不兼容,但在那里
没有理由说它们应该是因为它们的类型定义不同。
是否允许编译器执行此大小优化?
或者,换句话说,标准是否要求具有相同成员的2个结构总是会产生相同的布局?
答案 0 :(得分:1)
兼容类型的概念可能给出了答案。如果t1
和t2
是兼容类型,则可以使用指向t1
的指针来访问使用类型t2
设置的内存。
在C11标准中:
6.2.7兼容类型和复合类型
- ...此外,如果其标签和成员满足以下要求,则在单独的翻译单元中声明的两个结构,联合或枚举类型是兼容的:如果使用标记声明一个,则应使用相同的声明声明另一个标签即可。如果两者都在其各自的翻译单元内的任何地方完成,则以下附加要求适用:其成员之间应存在一对一的对应关系,以便每对相应的成员被宣布为兼容类型;如果使用对齐说明符声明该对中的一个成员,则使用等效的对齐说明符声明另一个成员;如果该对的一个成员使用名称声明,则另一个成员使用相同的名称声明。 ...
醇>
两个没有相同标签的结构是不兼容的类型,我没有看到任何强迫它们具有相同布局的结构。