繁体   English   中英

如何有效地在 std::vector 中插入一对?

[英]How to efficiently insert a pair in std::vector?

我有一个std::vector<std::pair<...>>并希望有效地修改它们:

vector<pair<int, int>> vec;
vec.emplace_back(4, 5);
vec.emplace_back(6, 7);

// Now I want to set the first pair in the vector.
vec[0] = make_pair(10, 10);

据我了解,我们有

  1. 临时对由make_pair构造。 这需要 2 个int副本。
  2. 下一个pair<int,int>& operator=( pair<int,int>&& other )被调用,它在pair中的两个int上调用std::move 这需要 2 个int副本。

结果我们4份ints!

但是在Vector修改一pair应该需要 2 个int副本。 emplace_back似乎是我需要的,但它只在向量的末尾进行就地构造,而不是在任何其他索引处。

我肯定能做到

vec[0].first = 10;
vec[0].second = 10;

但这考虑到了 pair 的内部结构,我想省略它。

如何更有效地编写代码(没有int的冗余副本)?

启用编译器优化,瞧,它们完全一样: https : //godbolt.org/z/Nwb_y0

GCC 8 生成的程序集是:

    mov     rax, QWORD PTR [rdi]
    mov     DWORD PTR [rax], esi
    mov     DWORD PTR [rax+4], edx

如您所见,整数只存储一次,没有额外的副本。

如果使用-O1而不是-O2-O3编译,对于没有make_pair的“更简单”版本,代码实际上更糟:它从向量中加载地址两次。 所以make_pair版本是更好-O1在更高级别的优化和相同的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM