首页 > 解决方案 > 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++stlcompiler-optimization

解决方案


这不是 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整个范围,而不是调用每个元素的副本。


推荐阅读