c++ - std::pair 赋值运算符的性能问题是什么?
问题描述
我看过演讲Danila Kutenin — C++ STL 最佳和最差性能特性(包括同一演讲的另一个版本),我读过博客,但我仍然不明白是什么阻碍了 std::pair 赋值运算符的优化。
与自定义对比较的godbolt链接,此处内联代码:
struct MyPair {
int a;
int b;
};
// slower
void CopyPair(const std::vector<std::pair<int, int>>& a,
std::vector<std::pair<int, int>>& b) {
std::copy(a.begin(), a.end(), b.begin());
}
// faster
void SmartCopyPair(const std::vector<MyPair>& a,
std::vector<MyPair>& b) {
std::copy(a.begin(), a.end(), b.begin());
}
解决方案
这不是 C++ 的问题,而是您使用的 STL 实现的问题。
如果您编写以下检查
static_assert(std::is_trivially_copyable_v<MyPair>,"MyPair is not trivially copyable");
static_assert(std::is_trivially_copyable_v<std::pair<int,int>>,"std pair is not trivially copyable");
您会注意到只有第二行无法编译。并非所有 STL 实现都是这种情况,而仅是您编译的那个,可能还有其他一些实现。
当std::is_trivially_copyable_v<T>
为真std::copy
时,向量的T
可能是实现级别优化到memcpy
整个范围,而不是调用每个元素的副本。
推荐阅读
- youtube-api - YouTube API 缩略图集端点抛出 403 被禁止
- php - 如何在 PHP 8.0 中键入 Juggle?
- php - phpmyadmin 加载 html 代码而不是普通页面
- c++ - 使用 `altera-struct-pack-align` 的 Clang-tidy 对齐建议
- rust - 将 Box 与 nom 解析器一起使用时出现神秘错误“一种类型比另一种更通用”
- c - 格式说明符如何在编译器中工作?
- php - 无法在路径中找到文件。无法断言 false 为 true
- javascript - 比较 Javascript 中的密码
- php - 如何使 multiCell 中的文本填满整个表格单元格?
- javascript - 使用 ES6 而不重新刷新页面时,事件侦听器不会重新附加到我的 HTML 元素