【问题标题】:Is padding in the structs always the same?结构中的填充总是相同的吗?
【发布时间】:2017-02-18 15:18:28
【问题描述】:
  1. 结构的元素必须正确对齐,因此可以用未使用的字节填充结构。
  2. 结构的大小始终相同(因为它是一个常量表达式)。

所以我认为编译器每次都必须以某种方式使用相同的填充,例如:

  • 放置单个结构实例
  • 将结构实例按值传递给函数
  • 从函数中按值返回结构实例
  • 在结构数组中

如果我对这个假设是正确的,你能指出 C 标准在哪里这么说吗?是否有任何严格的填充放置规则来保证此属性?

【问题讨论】:

  • 你的意思是“同一程序中结构的所有实例是否具有相同的布局”?
  • 填充和对齐是实现定义的。它可能因编译器而异,甚至在不同平台上的相同编译器之间也可能不同。
  • 理论上布局可能会在程序的不同运行之间发生变化
  • 您问了一个关于标准的问题,标准中的编译时和运行时没有区别。 “运行时”可能包括解释代码(而不是编译),或调用 JIT 编译器
  • @M.M 好的,一开始我问的是 C,而不是 C++,所以我查看了 C 草案。以 N1548 第 105 页(第 6.6 段)为例,您应该会找到我的报价。

标签: c struct language-lawyer


【解决方案1】:

C 通过草案this version 的§7.17 中的offsetof 宏的规范锁定特定结构类型中字段的偏移量,该规范描述了<stddef.h> 中所需的宏。

宏是

NULL

扩展为实现定义的空指针常量;和

offsetof(type, member-designator)

它扩展为一个类型为size_t 的整数常量表达式,其值为 这是结构成员(由member-designator指定)的字节偏移量, 从其结构的开头(由 type 指定)。类型和成员代号 应该是给定的

static type t;

然后表达式&(t.member-designator) 计算为地址常量。 (如果 指定成员是位域,行为未定义。)

由于它是一个常量表达式,每次使用特定结构类型都必须使用相同的偏移量(否则这将是完全疯狂的)。 两种不同的结构类型,即使声明相同,也不受此约束以具有相同的布局。 (例如,如果类型是在不同结构布局编译指示的控制下声明的,则它们不一定具有相同的布局,但声明看起来初步相同。typedef 是重要!)

【讨论】:

  • 我没有一个易于搜索的标准最终版本的参考,但如果有人有并且它已被移动或实质性改写,请编辑我的答案添加正确的位置。
  • 我期待一个这样的答案,但对这个问题的 cmets 提到标准中的编译时和运行时没有区别以及常量表达式 - 至少从语言观点 - 可以在运行时改变
猜你喜欢
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2017-11-07
  • 2011-08-13
  • 1970-01-01
相关资源
最近更新 更多