当重载operator ==()时,我目前正在执行
bool operator==(const X& lhs, const X& rhs)
{
return &lhs == &rhs || /* member comparisons ... */;
}
意思是我首先检查对象的引用相等性,然后检查所有成员的相等性。这是“正确”的方式吗?有什么难题或事情需要记住吗?这种实现方式是最有效的方法吗?
答案 0 :(得分:4)
自我比较通常很少见,除非你是一个不可变的内部pImpl,通常只在常规包装器==
碰撞后通过unordered_
容器中的std::hash
进行比较,或者某事类似。
针对罕见病例进行优化往往是个坏主意。它增加了代码的复杂性,并增加了测试开销。
如果比较昂贵或无限昂贵,则可能存在异常,因此在开始时失败的指针比较的成本是微不足道的。另一个例外是自我比较非常昂贵,几乎自我(几乎同样昂贵)非常罕见,而有时会进行自我比较。
简短的回答是,保持你的代码简单,担心大订单爆炸,不要不必要地悲观,并在实际注意到性能问题后进行优化(即使它只是"哇,那是慢"或蒙特卡罗分析。)