重载相等运算符==时,应先检查引用相等性

When overloading the equality operator==, should one check for reference equality first?

本文关键字:检查 引用 运算符 重载      更新时间:2023-10-16

当重载运算符==(),我目前做

bool operator==(const X& lhs, const X& rhs)
{
    return &lhs == &rhs || /* member comparisons ... */;
}

这意味着我首先检查对象的引用相等性,然后检查所有成员的相等性。这是"正确"的方式吗?有什么需要记住的陷阱或事情吗?这种实现是最有效的方法吗?

自我比较通常很少见,除非你是一个不可变的内部 pImpl,通常只在常规包装器发生std::hash碰撞后通过unordered_容器中的==进行比较,或者类似的东西。

针对极少数情况进行优化通常是一个坏主意。 它增加了代码的复杂性,并增加了测试开销。

如果比较昂贵

或无限昂贵,则可能存在异常,因此开始时指针比较失败的成本微不足道。 另一个例外是自我比较异常昂贵,而几乎自我比较(几乎同样昂贵)非常罕见,而自我比较有时会发生。

简短的回答是,保持代码简单,担心大阶爆炸,不要不必要的悲观,并在实际注意到性能问题后进行优化(即使它只是"哇,这很慢",或者蒙特卡罗分析)。