是否保证相同类型的值之间没有填充?
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
可能会因某种原因而变为 char
和 struct str_T
4?
@chux 是的,这是可能的。但是由于未指定,我无法引用可以保证这种行为的编译器 + 标志要求的示例。
所以你的结论是它没有被指定,但到目前为止没有任何实现不遵守它?
@iBug 是的,你是对的。我不知道静态断言会失败的任何实现。但是如果它允许在一致的实现上失败。【参考方案2】:
否,不能保证是相同的内存布局。
C11 6.7.2.1(p6):
结构是由一系列成员组成的类型,其成员 存储按顺序分配
该标准不强制执行任何布局规则。
【讨论】:
以上是关于是否保证相同类型的值之间没有填充?的主要内容,如果未能解决你的问题,请参考以下文章