【发布时间】:2021-04-23 04:30:10
【问题描述】:
从 C++20 开始,标准库使用 spaceship 运算符 来实现字符串和向量的比较(根据 this video)。我担心这会带来潜在的巨大性能损失!
让我以string 的运算符!= 为例进行说明:
- 当我编写
str1 != str2时,编译器现在将其转换为(str1 <=> str2) != 0。 - 但是,对于
string的!=的有效实现将首先检查str1.size() != str2.size(),并且只有在失败时才转移到比较实际字符。 - 无法为太空飞船操作员实施此优化,因为无论如何它都必须确定“更大”的字符串。
如果这真的是现在比较字符串的不等式,这不是巨大的性能损失吗?
【问题讨论】:
-
是否编译器会自动将其转换为
!=的宇宙飞船运算符?根据this 的说法,至少operator==仍然是主要的比较方法。尽管即使您没有定义operator!=,编译器仍可能会合成比较,但它不会使用 spaceship 运算符。所以你可以写得快operator==,写得快!=。
标签: c++ performance comparison c++20 spaceship-operator