我有一个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);
据我所知
make_pair
构成。这需要两份int
的副本。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
的冗余副本)?
答案 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
上更好,而在更高级别的优化上相同。