比较两个比较大的对象是否相等

麦可

我必须比较两个较大的对象是否相等。

对象的属性:

  1. 按值包含其所有成员(因此,没有要遵循的指针)。
  2. 它们还包含一些stl::array
  3. 它们包含1和2持有的其他一些对象。
  4. 大小最大为几kB。
  5. 其中一些members意愿可能会与其他意志有所不同,因此,如果先进行比较,则会导致比较操作更快地中断。
  6. 对象不变。基本上,该算法只是计算有多少个相同的对象。每个对象只能与几个“主”对象进行一次比较。

比较这些对象的最佳方法是什么?我看到三个选择:

  1. 只需使用普通的非重载即可operator==
  2. ==从可能不同的成员开始,重载并执行逐个成员的比较。
  3. 重载==并将对象视为纯字节字段,然后逐字比较。

一些想法:
选项1看起来不错,因为它意味着最少的工作量(以及引入错误的机会)。
选项2似乎不错,因为我可以利用启发式方法确定哪些元素最有可能不同。但是,也许它仍然较慢,因为==选项1的内置速度非常快。
选项3似乎是最“低级”优化的,但这也是编译器可能对选项1所做的。

所以问题是:

  • 有众所周知的最佳解决方案吗?
  • 这些选择之一是绝对不行吗?
  • 我还需要考虑其他事项吗?
持有

一个好问题。

如果您对哪些成员可能有所不同有所启发,请使用它。因此,首先超载operator ==和检查可疑成员似乎是一个好主意。

关于按字节比较(又名memcmp和朋友)-由于结构成员对齐,可能会出现问题。也就是说,编译器有时会在结构布局中放置“空白”,以便每个成员都需要进行对齐。这些未初始化,通常包含垃圾。

这可以通过对整个对象进行显式零初始化来解决。但是,我看不到memcmpvs automatic的任何优势operator ==,这是在成员方面的比较。它可能可以节省一些代码大小(一次调用memcpyvs显式读取和比较),但是从性能的角度看,这几乎是相同的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章