Emplace_back()的行为不符合预期

emplace_back() does not behave as expected

本文关键字:不符合 back Emplace      更新时间:2023-10-16

我编写了一个简单的程序来处理在标准库容器中就地创建对象的问题。这是我写的:

#include <vector>
#include <iostream>
class AB
{
public:
   explicit AB(int n);
   AB(const AB& other) = delete;
   AB(AB&& other);
   AB& operator=(const AB& other) = delete;
   AB& operator=(AB&& other) = default;
private:
   int i;
};
AB::AB(int n): i( n )
{
   std::cout << "Object created." << std::endl;
};
AB::AB(AB&& other): i( std::move(other.i) )
{
   std::cout << "Object moved." << std::endl;
};
int main()
{
   std::vector< AB > v;
   v.emplace_back(1);
   v.emplace_back(2);
   v.emplace_back(3);
};

我用g++(版本4.8.2)编译它。运行输出后,我得到:

Object created.
Object created.
Object moved.
Object created.
Object moved.
Object moved.

但我期望是这样的:

Object created.
Object created.
Object created.

我认为放置的全部意义在于摆脱移动构造函数调用。AB类是否有未满足的要求?

谢谢你的帮助。

问题是,当您添加更多元素时,您的矢量正在调整大小,导致额外的移动。如果一开始就预留了足够的容量,就会得到预期的结果:

   std::vector< AB > v;
   v.reserve(3);
   v.emplace_back(1);
   v.emplace_back(2);
   v.emplace_back(3);

Object created.
Object created.
Object created.

在gcc 4.8.2。注意,您可以通过查看v.capacity()来跟踪原始代码中矢量的增长。

放置的目的是摆脱COPY构造函数调用。它可能会移动物体,因为当它满了的时候会调整矢量的大小。移动物体是可以的。复制对象的成本很高。