C++ memcmp是否适用于非平面结构?

C++ memcmp是否适用于非平面结构?,c++,c,struct,padding,memcmp,C++,C,Struct,Padding,Memcmp,在我的编译器中,它可以工作,这意味着 f1.a1==f2.a1,f1.a2==f2.a2 memcmp(f1,f2)==0 我假设它也适用于非平面结构。然而,在我的编译器中,对于非平面结构,似乎即使成员属性相等,memcmp的结果表明它们是不同的 你的结构是扁平的 非平面结构有指针 您还没有初始化这些结构。C库函数对内存位置进行逐字节比较。正如@MSalters正确指出的,此比较将包括任何和所有填充字节 对于“平坦”或“非平坦”的任何定义,它都不关心结构是平坦的还是非平坦的。它不关心也不了解结构

在我的编译器中,它可以工作,这意味着

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


我假设它也适用于非平面结构。然而,在我的编译器中,对于非平面结构,似乎即使成员属性相等,memcmp的结果表明它们是不同的

你的结构是扁平的

非平面结构有指针

您还没有初始化这些结构。

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

对于“平坦”或“非平坦”的任何定义,它都不关心结构是平坦的还是非平坦的。它不关心也不了解结构语义

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


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

“它可以工作”这并不意味着你认为它意味着什么。你的结构在我看来非常扁平。当使用组合时,结构是“扁平的”。当使用聚合时,它不是。你的
Flat
NonFlat
结构都在使用组合,因此都是“Flat”。哦,你似乎没有正确调用
memcmp
。伙计们,要么你是对的,要么我的编译器是错的,要么相反。注意:这包括填充字节。注意:1)使用
size==0
memcmp()
返回0。2) 如果字节都相等,它将返回0。通常认为0是假的。
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) 
NonFlat n1, n2;
memcmp (&n1, &n2, sizeof n1) // does it also work for non-flat structs, considering the padding?