gpt4 book ai didi

c++ - 用右值构造一对

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:14 25 4
gpt4 key购买 nike

在此:

    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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com