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

时间:2018-10-19 23:00:00

标签: c++ int std move stdvector

我有一个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构成。这需要两份int的副本。
  2. 接下来调用pair<int,int>& operator=( pair<int,int>&& other ),它在std::move中的两个int上调用pair。这需要两份int的副本。

结果,我们获得了4个int副本!

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

可以肯定

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

但是这考虑了对的内部,我想省略。

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

1 个答案:

答案 0 :(得分:1)

启用编译器优化并确保它们完全相同: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上更好,而在更高级别的优化上相同。