在此:
vector<pair<string,int>> vp;
string s;
int i;
while(cin>>s>>i) vp.push_back({s,i});
我对最后一行很好奇。该对是在对 push_back
的调用中构造的,因此它是移动的,而不是复制的,对吗?
如果它被写成这样:
vector<pair<string,int>> vp;
string s= ...;
int i= ...;
pair<string,int> p{s,i};
vp.push_back(p);
虽然该对的构造涉及相同的资源,但现在该对被命名为 p
,因此它不再是右值,因此不再使用移动语义,因此这是通过的按值,导致复制,对吧?
这对我来说意味着,在可能的情况下,在 arg 列表中构造对象是一种性能改进;谁能验证一下?
最佳答案
The pair is constructed in the call to
push_back
, therefore it is moved, not copied, correct?
构造临时对,然后将其绑定(bind)到 push_back
的右值引用参数。然后将其从该参数移动到 vector
中。
vp.push_back({s,i});
相当于:
vp.push_back(std::pair<std::string, int>{s, i});
大致相当于:
std::pair<std::string, int> p{s, i};
vp.push_back(std::move(p));
您不需要临时使用右值引用重载。
您的第二个代码示例:
pair<string,int> p{s,i};
vp.push_back(p);
复制而不是移动,是的。请注意,无论哪种方式,我们仍在将 s
复制到对中(临时或 p
)。因此,更好的方法是将 s
也移动到临时文件中:
vp.push_back({std::move(s), i});
或者甚至没有中间对开始:
vp.emplace_back(std::move(s), i);
This implies to me that where possible, constructing objects inside arg lists is a performance improvement; can anyone verify?
移动 是一种性能改进,但您始终可以std::move()
将参数放入函数中 - 它不需要是临时的。在 arg 列表中构造会影响何时调用移出对象的析构函数,仅此而已。
关于c++ - 用右值构造一对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36726914/