矢量emplace_back

时间:2012-07-09 10:06:08

标签: c++ stl c++11

您能解释一下“完美转发”的工作原理吗?

我读到vector的emplace_back不需要复制或移动对象,因为它的参数是作为可变参数模板实现的。

std::vector<T>::emplace_back(_Args&&... __args)

你能更详细地描述一下吗?为什么不复制或移动?

2 个答案:

答案 0 :(得分:15)

emplace_back直接在向量中的正确位置构造元素。把它想象成好像

vector<T> v;
v.emplace_back(a,b,c);

转换为(idx是新索引)

new (v.data()+idx) T(a,b,c);

(现实情况有点复杂,涉及将参数转发为std::forward<_Args>()...,但是获取行动操作的关键可能会更加混乱)

答案 1 :(得分:2)

emplace_back实际上发生了两件事:

  1. 你没有传递T类型的对象,而是传递T的构造函数。这样,​​对象构造被延迟:向量被扩展以适应新对象所需的内存,并且构造函数被调用初始化向量中的对象。 Variadic模板与副本没有任何关系,它们只允许向构造函数转发可变数量的参数。
  2. 不会复制构造函数本身的参数,因为它们作为rvalues引用传递,而std :: move用于将它们转发给构造函数。基本上,移动语义避免了对象的深层复制。