c++ - C++20 宇宙飞船运算符的性能问题?
问题描述
从 C++20 开始,标准库使用spaceship 运算符来实现字符串和向量的比较(根据此视频)。我担心这会带来潜在的巨大性能损失!
让我解释一下运算符的!=
示例string
:
- 当我编写
str1 != str2
时,编译器现在将其转换为(str1 <=> str2) != 0
. - 然而,一个有效的
!=
for实现string
将首先检查 forstr1.size() != str2.size()
,并且只有在失败时才转移到比较实际字符。 - 这种优化无法为 spaceship 运算符实现,因为无论如何它都必须确定“更大”的字符串。
因此,如果这确实是现在比较字符串的不等式,这不是巨大的性能损失吗?
解决方案
标准化委员会已经在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1185r2.html中解决了这个问题。该更改表示a ==
b 和a != b
没有调用operator <=>
,它们正在调用operator==
and operator !=
。您描述的行为是后来修订的 C++20 标准的临时版本。
链接的变更请求正好给出std::vector
了一个例子,其中==
可以比较比<=>
.
推荐阅读
- postman - 如何从邮递员的集合中运行任何特定请求?
- java - java - 如何使用Java servlet从用户那里获取动态输入?
- bash - 在保留列的同时将 Bash 输出到同一行
- javascript - SocketIO 离开房间功能不工作
- csv - 试图在 NEO4J 中加载 csv 关系
- node.js - 如何将表单中的数据加载到请求正文中
- c++ - 延长Windows服务停止时间
- pandas - 如何选择和替换 pandas 字符串列中的主要关键字?
- javascript - 在 userPrefs 中设置什么以在 puppeteer-extra 的底部打开 devtools?
- java - sbt - 在 Jdk 1.7 中执行时,不支持的 major.minor 版本 52.0 错误