假设我有一个包含2个字段的结构和C的实现,我在这些字段之间也有一些填充。
如果我创建了struct的两个变量并将它们分配给另一个,那么填充是否会保证相等?
我知道对于大多数编译器来说都是如此(因为它们只调用memcpy),但是我想知道标准中有关填充的内容是什么?
对此问题的意图是,我可以使用memcmp
来检查结构的相等性。
假设我有一个编译器,它发出的代码只是分配结构的所有成员而不是执行memcpy
,它是否是struct操作赋值的有效实现?
答案 0 :(得分:6)
标准在note 51 of 6.2.6.1 General中说:
因此,例如,结构分配不需要复制任何填充位。
答案 1 :(得分:6)
6.2.6.1一般
...
6当值存储在结构或联合类型的对象中时,包括在成员中 object,对象表示的字节,对应于任何填充字节 未指定的值。 51)结构或联合对象的值永远不是陷阱表示,即使结构或联合对象的成员的值可能是 陷阱表示。
7当值存储在union类型的对象的成员中时,该对象的字节数 表示与该成员不对应但与其他成员对应的表示 取未指定的值。 51)因此,例如,结构分配不需要复制任何填充比特。
脚注51直接解决了您的问题 - 填充位的内容可能无法在分配中复制,因此memcmp
可能无法比较两个structs
的相等性。
答案 2 :(得分:1)
我认为你不能使用memcmp
,因为成员之间的内存(即“padding”-area中的内容)不能保证具有某个值,并且分配这样的结构-object to another也不需要复制填充内容。