考虑以下代码:
// T is *any* type
struct str_T{
T a, b;
};
我知道在具有不同路线的物体之间有(几乎总是)填充,因为两个成员都是T
类型。但这次没有不同的对齐方式。这种说法总能通过吗?
static_assert(sizeof(str_T) == 2 * sizeof(T));
// i.e. padding-free
答案 0 :(得分:6)
不,这不能保证。 编译器总是可以决定填充或不填充struct成员之间的额外位。 (除非被覆盖)
引自C11 draft, 6.7.2.1结构和联合说明符
在结构对象中,非位字段成员和单位 哪些位字段驻留的地址按顺序增加 他们被宣布。适当地指向结构对象的指针 转换后,指向其初始成员(或者如果该成员是 位字段,然后到它所在的单元,反之亦然。 结构对象中可能有未命名的填充,但不在其中 开始强>
答案 1 :(得分:1)
否,无法保证内存布局相同。
C11 6.7.2.1(第6页):
结构是由一系列成员组成的类型,其成员 存储按有序顺序分配
该标准不强制执行任何布局规则。