C++20 飞船操作符的性能问题?

问题描述

从 C++20 开始,标准库使用 spaceship 运算符 来实现字符串和向量的比较(根据 this video)。我担心这会带来潜在的巨大性能损失!

让我解释一下 != 的运算符 string 的例子:

  • 当我编写 str1 != str2 时,编译器现在将其转换为 (str1 <=> str2) != 0
  • 但是,!=string 的有效实现将首先检查 str1.size() != str2.size(),只有在失败时才转移到比较实际字符。
  • 无法为飞船操作员实施此优化,因为无论如何它都必须确定“更大”的字符串。

所以,如果现在真的是这样比较字符串的不等式,这不是一个巨大的性能损失吗?

解决方法

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1185r2.html 中的标准化委员会已经解决了这个问题。该更改表示 a == b 和 a != b 不是调用 operator <=>,而是调用 operator==operator !=。您描述的行为是后来修订的 C++20 标准的临时版本。

链接的更改请求恰好以 std::vector 为例,其中 == 可以比 <=> 更有效。