【问题标题】:Performance problems with the C++20 spaceship operator?C++20 宇宙飞船操作符的性能问题?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2021-11-13
    • 1970-01-01
    • 2012-12-14
    • 2021-07-27
    • 2011-03-04
    相关资源
    最近更新 更多