比较C与C++中的结构

Met*_*hos 1 c++ class

我想比较C++类/结构对象.在C中,大多数时候,人们struct通过将各个字段的大小相加来知道确切的大小(假设编译器不添加填充).因此可以在两个对象上使用memcmp()函数来非常快速地比较它们.我不确定C++是否适用.这是因为一个类也有函数定义,也许还有一些其他隐藏的东西(也许是一些RTTI信息?虚拟函数表甚至?)

用含有简单结构的快速程序intchar部件以及功能显示,该结构的大小为sizeof(int)+sizeof(char).

我有一个大的struct类,包含简单的int,char等数据类型(但是有很多).我想不时地比较对象.我不能重载==运算符,因为它会使它们按字段比较每个字段.在C中,我可以一次性比较使用memcmp().有关C++的任何建议吗?我可以memcmp()直接使用吗?我不希望memcmp()失败因为虚拟函数指针表之类的其他值不同(但所有字段实际上都相等)(我正在使用g ++)

Jon*_*ler 10

警惕很多......

  1. 任何填充中的值都是不确定的,因此无法比较.
  2. 如果您的机器是little-endian,比较整数字段将产生一个答案; 如果您的机器是大端的,它将产生另一个答案.
  3. 大多数人认为-1小于0,但memcmp()会进行逐字节无符号比较,因此将-1视为大于0.
  4. 任何指针本质上都不具有可比性memcmp().
  5. 你无法比较floatdouble使用memcmp().

总的来说,您正在寻求一种非合理的优化.

  • 对此+1:“您正在寻求不明智的优化”。但仅供参考,您*可以*使用 memcmp 比较 float 和 double;相同的数字是相同的位模式。 (2认同)

Cra*_*rks 9

可以采用sizeof()结构或类.

编辑: 因为我提供了上面的答案,你已经改变了你的问题"如何手动确定C++结构和类的大小?" 关于比较两个类的更一般的一个.

简短的回答是,您确实想要使==运算符超载.相信每次按字段比较每个字段的信念是不正确的; 您可能会重载operator ==以使用您喜欢的任何算法,包括a memcmp.

memcmp()从第一个字段偏移到最后一个的内存应该可以正常工作.甲memcmp()如果是在类类型A的比较另一个类B,其从A继承,对类的整个覆盖区可能会失败作为V表指针可以是不同的.

  • 没有; memcmp()不能保证工作.即使是POD结构,也不能保证在一台机器上工作; 它肯定不能保证可以跨机器工作. (2认同)