我知道它的语法。 我只是想知道有什么好处,或者它是否有意义。
没有它,我们必须像这样编码:
void func1(int x, int y) {
if( x > y )
doSomeThing();
else if( x < y )
doSomeElse();
else
explosive();
}
有了它,我们可以这样做:
void func1(int x, int y) {
auto result = x <=> y;
if( result > 0 )
doSomeThing();
else if( result < 0 )
doSomeElse();
else
explosive();
}
除了返回比较结果外,我看不到此功能的任何好处。 有人说它可以使我们的代码更具可读性,但我不这么认为。 很明显,前一个例子具有更高的可读性。
至于返回一个结果,像这样:
int func1(int x, int y) {
return x <=> y;
}
看起来我们获得了更多的可读性,但我们仍然需要在某个地方使用另一个 if/else 检查值,例如在 func1 之外。
我看不到此功能的任何好处。
那么你对实际发生的事情思考得太狭隘了。
直接使用<=>
并不能满足int
的需求。它可用于比较它们,但int
不是该功能存在的原因。
它适用于实际具有复杂比较逻辑的类型。考虑std::string
.要知道一个字符串是否"小于"另一个字符串,您必须遍历两个字符串并比较每个字符。当你找到一个不等价的,你就有了答案。
您的代码应用于string
时,会进行比较两次:一次是小于,一次是大于。问题是:第一次比较已经找到了第一个不相等字符。但第二个比较不知道那在哪里。所以它必须从头开始,做与第一个完全相同的比较。
与已经计算出的第一个比较相比,这是一个重复的答案。事实上,有一种非常简单的方法来计算字符串的<=>
:从第一个字符串中减去第二个字符串中的相应字符。如果值为零,则它们相等。如果结果为负数,则第一个字符串较少;如果为正数,则第一个字符串更大。
这是...<=>
到底回报了什么,不是吗?通过使用<=>
,您可以在一个空间中进行两个昂贵的比较;测试返回值与它们的成本无关紧要。
比较逻辑越复杂,如果需要将它们分类为更少/更大/相等,则使用<=>
保存的金额就越大。
还应该注意的是,处理器通常具有特殊的操作码来判断整数是负数、零还是正数。如果我们查看 x86 程序集以进行整数比较:
func1(int, int): # @func1(int, int)
cmp edi, esi
jle .LBB0_1
jmp a()@PLT # TAILCALL
.LBB0_1:
jge .LBB0_2
jmp b()@PLT # TAILCALL
.LBB0_2:
jmp c()@PLT # TAILCALL
我们可以看到它只执行一次cmp
;jle
和jge
指令使用比较的结果。<=>
编译为同一程序集,因此编译器完全理解为同义词。