结构中的填充总是一样的吗?

时间:2016-10-10 08:32:13

标签: c struct language-lawyer

  1. 结构的元素必须正确对齐,因此可以使用未使用的字节填充struct。
  2. 结构的大小始终相同(因为它是一个常量表达式)。
  3. 所以我认为编译器必须以某种方式每次使用相同的填充,例如:

    • 放置单个结构实例
    • 按值将结构实例传递给函数
    • 通过函数
    • 中的值返回struct实例 结构数组中的

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

1 个答案:

答案 0 :(得分:0)

C通过offsetof宏的规范,在草案的this version的第7.17节中锁定了特定结构类型中字段偏移的内容,其中描述了HKCU中所需的宏。 {1}}。

  

宏是

<stddef.h>
     

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

NULL
     

扩展为类型为offsetof(type, member-designator) 的整数常量表达式,其值为   这是结构成员的偏移量(以字节为单位)(由 member-designator 指定),   从其结构的开头(由 type 指定)。类型和成员指示符   应该是给定的

size_t
     

然后表达式static type t; 计算为地址常量。 (如果   指定的成员是位字段,行为未定义。)

因为它是常量表达式,所以每次使用特定结构类型都必须使用相同的偏移量(或者这都是完全疯狂的)。 两个不同的结构类型,即使声明相同,也不受此限制,以具有相同的布局。 (例如,如果类型是在不同结构布局编译指示的控制下声明的,那么它们不一定具有相同的布局,但声明看起来表面上相同。{{1}很重要!)