C++20 中三向比较运算符 (<=>) 有什么好处?

问题描述 投票:0回答:1

我知道它的语法。 我只是想知道有什么好处或者是否有意义。

没有它,我们必须这样编码:

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 之外。

c++ syntax comparison operators c++20
1个回答
1
投票
我看不出此功能有任何好处。

那么你对实际发生的事情的思考太狭隘了。

不存在直接使用

<=>

来满足

int
的需求。它可以用于比较它们,但
int
并不是该功能存在的原因。
它存在于实际上具有复杂比较逻辑的类型。考虑

std::string

。要知道一个字符串是否“小于”另一个字符串,您必须迭代两个字符串并比较每个字符。当您找到不等效的时,您就有了答案。

您的代码在应用于 

string

时会进行两次比较:一次小于,一次大于。问题是这样的:第一次比较已经找到了第一个不相等的字符。但第二个比较

不知道
那是哪里。所以它必须从头开始,进行与第一个完全相同的比较。 与已经计算出的第一次比较相比,要得到答案需要进行大量的重复工作。事实上,有一种非常简单的方法来计算字符串的

<=>

:从第一个字符串中减去第二个字符串中的相应字符。如果该值为零,则它们相等。如果结果为负数,则第一个字符串较小;如果为正,则第一个字符串更大。

这...正是 

<=>

返回的,不是吗?通过使用

<=>
,您可以在 1 的空间内进行两次
昂贵
的比较;测试返回值与它们的成本相比并不重要。 您的比较逻辑越复杂,如果您需要将它们分类为小于/大于/等于,您就越有可能使用

<=>

节省更多。

还应该注意的是,处理器通常有特殊的操作码来判断整数是负数、零还是正数。如果我们查看 

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
指令使用比较结果。
<=>
编译为相同的程序集,因此编译器完全将它们理解为同义词。
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.