c++ - 用右值构造一对

标签 c++ c++11

在此:

    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/

相关文章:

c++ - 为什么这会导致超出范围的异常

c++ - 在 C++ 中计算 10 的整数幂比 pow() 更快吗?

c++ - SFINAE : Know if a function already exist or no

c++ - decltype 和模板 - 有什么方法可以使 decltype 机器不那么复杂吗?

c++ - 检查 C++11 中运算符是否存在的最佳方法

c++ - 不同于导出的 DLL 函数名称

c++ - Qt - 无法分配给不存在的属性(自定义 C++ 类)

c++ - 将单个成员从 vector A 分配给 vector B 的智能方法

c++ - 如何生成 N 类型 T 的元组?

c++ - std::shared_ptr - 将共享指针作为参数传递的最佳实践