C++20 宇宙飞船运算符的性能问题?
Performance problems with the C++20 spaceship operator?
自 C++20 起,标准库使用 宇宙飞船运算符 来实现字符串和向量的比较(根据 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
作为示例,其中 ==
可以比 <=>
更有效地进行比较。
自 C++20 起,标准库使用 宇宙飞船运算符 来实现字符串和向量的比较(根据 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
作为示例,其中 ==
可以比 <=>
更有效地进行比较。