在他的“宇宙飞船”运算符提案中(第2.2.2节,第12页底部),Herb Sutter说:
基于 <=> 和其返回类型:这种模型具有重大优势,与之前对C++和其他语言的建议相比,一些独特之处:
[...]
(6)效率,包括最终实现零开销抽象比较:绝大多数比较总是单通道的。唯一的例外是,在支持部分排序和相等性的类型情况下生成 <= 和 >=。对于<,单通道是实现零开销原则的关键,以避免重复相等比较,例如用于
struct Outer { Employeee; /*more members*/ };
的struct Employee { string name; /*more members*/ }
——今天的比较违反了零开销抽象,因为Outer
上的operator <
执行冗余的相等比较, 它执行if (e != that.e) return e < that.e;
,这会两次遍历e.name
的相等前缀(如果名称相同,则其他Employee
成员的相等前缀也会被遍历两次),这通常无法优化。正如Kamiński所指出的那样,零开销抽象是C++的支柱,并且首次实现其比较是基于<=>的设计的显着优势。
但是他随后举了这个例子(第1.4.5节,第6页):
class PersonInFamilyTree { // ...
public:
std::partial_ordering operator<=>(const PersonInFamilyTree& that) const {
if (this->is_the_same_person_as ( that)) return partial_ordering::equivalent;
if (this->is_transitive_child_of( that)) return partial_ordering::less;
if (that. is_transitive_child_of(*this)) return partial_ordering::greater;
return partial_ordering::unordered;
}
// ... other functions, but no other comparisons ...
};
将operator>(a,b)
定义为a<=>b > 0
,不会导致很大的开销吗?(尽管形式上与他所讨论的不同)。该代码将首先测试相等性,然后测试less
,最后测试greater
,而不仅仅是直接测试greater
。
这里有什么我没有注意到的地方吗?
a<=>b > 0
,进入小于和等于分支有什么用呢? - Robert Andrzejukis_the_same_person_as
和is_transitive_child_of
都是无副作用的,并且if语句条件中最多只有一个条件会同时为真,才可能发生这种情况。换句话说,这种可能性非常小。 - TLW