自 C++20 起,标准库使用 spaceship 运算符 来实现字符串和向量的比较(根据 此视频)。我担心这会带来潜在的巨大性能损失!
让我解释一下
!=
的运算符 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
作为示例,其中 ==
可以比 <=>
更有效地进行比较。