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

Posted

技术标签:

【中文标题】是否保证相同类型的值之间没有填充?【英文标题】:Is it guaranteed that there's no padding between values of the same type? 【发布时间】:2018-05-12 17:40:40 【问题描述】:

考虑这段代码:

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

我知道(几乎总是)具有不同对齐方式的对象之间存在填充,因为这两个成员都是T 类型。但这一次没有不同的对齐方式。这个断言能一直通过吗?

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

【问题讨论】:

相关问题:***.com/questions/47324044/… _Alignof(str_T::a) == _Alignof(str_T::b)是真的吗? 即使struct 成员之间没有填充,struct 末尾可能的填充呢?这也将计入sizeof 的结果中。 @chux 不,不同的结构类型肯定有不同的对齐要求。再次阅读您的报价:它谈论的是结构的指针,而不是结构本身。 【参考方案1】:

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

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

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

【讨论】:

所以 T 可能会因某种原因而变为 charstruct str_T 4? @chux 是的,这是可能的。但是由于未指定,我无法引用可以保证这种行为的编译器 + 标志要求的示例。 所以你的结论是它没有被指定,但到目前为止没有任何实现不遵守它? @iBug 是的,你是对的。我不知道静态断言会失败的任何实现。但是如果它允许在一致的实现上失败。【参考方案2】:

,不能保证是相同的内存布局。

C11 6.7.2.1(p6):

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

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

【讨论】:

以上是关于是否保证相同类型的值之间没有填充?的主要内容,如果未能解决你的问题,请参考以下文章

如何用sql实现自动填充日期

具有相同成员类型的 C 结构是不是保证在内存中具有相同的布局?

POD 类型的填充字节是不是被复制?

T SQL:交换不同表中相同类型的两个值

使用In-cell下拉列表中的值自动填充单元格 - VBA

C struct:没有填充的连续字段?