假设我有一个有两个字段的结构体,我的C实现在这些字段之间也有一些填充。
如果我创建两个该结构体的变量,并将其中一个分配给另一个,那么填充是否保证相等?
我知道对于大多数编译器来说是这样的(因为它们只是调用memcpy),但我想知道标准中对填充的规定是什么?
提问的意图是,我能否使用 memcmp
检查结构体的相等性。
假设我有一个编译器,它发出的代码只是将结构体的所有成员赋值,而不是执行 memcpy
,那么它是否是结构体操作分配的有效实现?
假设我有一个有两个字段的结构体,我的C实现在这些字段之间也有一些填充。
如果我创建两个该结构体的变量,并将其中一个分配给另一个,那么填充是否保证相等?
我知道对于大多数编译器来说是这样的(因为它们只是调用memcpy),但我想知道标准中对填充的规定是什么?
提问的意图是,我能否使用 memcmp
检查结构体的相等性。
假设我有一个编译器,它发出的代码只是将结构体的所有成员赋值,而不是执行 memcpy
,那么它是否是结构体操作分配的有效实现?
因此,例如,结构分配不需要复制任何填充位。
memcmp
比较结构体,使用memcpy
复制结构体和使用bzero
清除结构体的旧代码 - 因此,即使标准说“你不需要”,大多数编译器仍会实现“精确”结构体的副本,因为它们根本无法承受破坏这些代码的代价。 - tofro6.2.6.1 常规
...
6 当一个值被存储在结构体或联合类型的对象中,包括成员对象时,与任何填充字节对应的对象表示的字节都取未指定的值。51) 结构体或联合对象的值永远不是陷阱表示,尽管结构体或联合对象的成员的值可能是陷阱表示。
7 当一个值被存储在联合类型对象的成员中时,与该成员不对应但对应于其他成员的对象表示的字节都取未指定的值。
51) 因此,例如,结构分配不需要复制任何填充位。
脚注51直接解答了你的问题 - 分配时不会复制填充位的内容,因此memcmp
可能无法用于比较相等的两个structs
。
memcmp
,因为成员之间的内存(即“填充”区域中的内容)不能保证具有确定的值,并且将这样的结构对象分配给另一个对象时不需要复制填充内容。
x = y
的情况下,我认为填充是否相同取决于实现。 - BLUEPIXYmemcmp
来比较结构体的相等性吗? - Ajay Brahmakshatriyamemcmp
。 - BLUEPIXY