是否保证相同类型的值之间没有填充?

时间:2017-11-29 05:20:15

标签: c struct language-lawyer padding

考虑以下代码:

// T is *any* type
struct str_T{
    T a, b;
};

我知道在具有不同路线的物体之间有(几乎总是)填充,因为两个成员都是T类型。但这次没有不同的对齐方式。这种说法总能通过吗?

static_assert(sizeof(str_T) == 2 * sizeof(T));
// i.e. padding-free

2 个答案:

答案 0 :(得分:6)

不,这不能保证。 编译器总是可以决定填充或不填充struct成员之间的额外位。 (除非被覆盖)

引自C11 draft 6.7.2.1结构和联合说明符

  

在结构对象中,非位字段成员和单位   哪些位字段驻留的地址按顺序增加   他们被宣布。适当地指向结构对象的指针   转换后,指向其初始成员(或者如果该成员是   位字段,然后到它所在的单元,反之亦然。   结构对象中可能有未命名的填充,但不在其中   开始

答案 1 :(得分:1)

,无法保证内存布局相同。

C11 6.7.2.1(第6页):

  

结构是由一系列成员组成的类型,其成员   存储按有序顺序分配

该标准不强制执行任何布局规则。