c++11 - 对于已构造的对象,使用 std::move 的 C++11 Push_back() 与 emplace_back() 的效率

标签 c++11 move-semantics push-back emplace

在 C++11 中,emplace_back() 通常优先于 push_back()(就效率而言),因为它允许就地构造,但是将 push_back(std::move()) 与已构造的对象一起使用时仍然是这种情况吗?

例如,在以下情况下,emplace_back() 仍然是首选吗?

std::string mystring("hello world");
std::vector<std::string> myvector;

myvector.emplace_back(mystring);
myvector.push_back(std::move(mystring));
// (of course assuming we don't care about using the value of mystring after)

此外,在上面的示例中,改为执行以下操作是否有任何好处:

myvector.emplace_back(std::move(mystring));

或者这里的举动完全是多余的,或者没有效果?

最佳答案

让我们看看您提供的不同调用的作用:

  1. emplace_back(mystring) :这是新元素的就地构造,无论您提供什么参数。由于您提供了左值,该就地构造实际上是复制构造,即这与调用 push_back(mystring) 相同。

  2. push_back(std::move(mystring)) :这称为 move 插入,在std::string的情况下是这样的。是一个就地 move 结构。

  3. emplace_back(std::move(mystring)) :这又是根据您提供的论点进行的就地构造。由于该参数是右值,因此它调用 std::string 的 move 构造函数,即它是一个像 2 中那样的就地 move 结构。

换句话说,如果使用 T 类型的一个参数调用,无论是右值还是左值,emplace_backpush_back是等价的。

但是,对于任何其他参数,emplace_back赢得比赛,例如 char const*vector<string> :

  • emplace_back("foo")来电 std::string(char const*)用于就地施工。

  • push_back("foo")首先得调用std::string(char const*)用于匹配函数签名所需的隐式转换,然后像上面的情况 2 那样进行 move 插入。因此它相当于push_back(string("foo"))

  • 关于c++11 - 对于已构造的对象,使用 std::move 的 C++11 Push_back() 与 emplace_back() 的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26860749/

    相关文章:

    c++ - 值传递有那么快吗?

    c++ - 基于范围的循环、唯一指针和 move 语义

    c++ - 在函数类中使用 push_back 更新指针 vector 的大小

    C++使用分隔符逐行读取文件并将数据存储到列表中

    C++:如何优化标准布局类模板中的空数据成员?

    c++ - 试图取消引用迭代器的段错误

    c++ - 如何防止右值和左值成员函数之间的代码重复?

    c++ - 链表的 Push_front 和 push_back 方法似乎删除了一个节点

    c++ - 从没有虚函数的类继承的最佳方法

    c++ - 逗号运算符、return 语句和 nullptr 没有副作用吗?