c++ - memcmp 适用于非平面结构吗?

标签 c++ c struct padding memcmp

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 的结果也表明它们是不同的。

最佳答案

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

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

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

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

关于c++ - memcmp 适用于非平面结构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26430353/

相关文章:

C++危险的类型转换代码

c++ - 我正在尝试创建一个 C++ 映射,其中包含 boost 内存映射文件中的 vector 值

索引链表的 C++/STL 结构(哈希表中的索引)

C# - 如何在包含数组的结构中编码(marshal)非托管结构

c - 为什么使用 struct 可以工作而 typedef struct 不行?

c - 在 C 中按值传递结构而不是传递指针有什么缺点吗?

c++ - 如何将 2 个 char* 数组直接映射到 std::map<std::string,std::string>

c++ - 如何在常量数组中重载 "[][] operator"?

c - 递归二分查找

c - 如何获取事件窗口的名称?