【问题标题】:does memcmp work for non-flat struct?memcmp 是否适用于非平面结构?
【发布时间】:2014-10-18 01:48:32
【问题描述】:
struct Flat {
  int a1; 
  int a2;
}
// a hierarchical struct which containing a struct attribute
struct NonFlat {
  Flat  b1; 
  int b2;
}

Flat f1, f2;
memcmp (&f1, &f2, sizeof f1) 

在我的编译器中,它可以工作,意思是

f1.a1 == f2.a1, f1.a2 == f2.a2 memcmp (f1, f2) == 0;

NonFlat n1, n2;
memcmp (&n1, &n2, sizeof n1) // does it also work for non-flat structs, considering the padding?     

我认为它也应该适用于 NonFlat 结构。但是,在我的编译器中,对于非平面结构,似乎即使成员属性相等, memcmp 的结果表明它们是不同的。

【问题讨论】:

  • “它有效”并不意味着你认为它的意思。
  • 你的结构对我来说似乎很平坦。
  • 使用合成时,结构是“扁平的”。使用聚合时不是。您的 FlatNonFlat 结构都在使用组合,因此是“扁平的”。
  • OTOH,你似乎没有正确调用memcmp
  • 伙计们,要么你是对的,我的编译器是错的,要么是相反

标签: c++ c struct padding memcmp


【解决方案1】:

C 库函数memcmp 对内存位置进行逐字节比较。正如@MSalters 正确指出的那样,这种比较将包括任何和所有填充字节。

对于平面或非平面的任何定义,它并不关心您的结构是平面还是非平面。它不关心或不了解结构语义。

如果字节相等,则返回true。否则返回false。

这意味着,对于任何成员在内存中连续放置的结构,如果所有字段都匹配,它将匹配。对于任何具有指向内存中其他位置的指针的结构,它不会跟随这些指针来查看它们指向的内存是否匹配,而只会查看存储在指针中的文字地址并查看是否匹配。

【讨论】:

  • 注意:这包括填充字节。
  • 注意:1)size == 0memcmp()返回0。2)如果字节都相等,则返回0。通常0被认为是false。
【解决方案2】:

你的结构是扁平的。

非平面结构有指针。

你还没有初始化那些结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2019-02-07
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    相关资源
    最近更新 更多