繁体   English   中英

emplace_back()的行为与预期不符

[英]emplace_back() does not behave as expected

我编写了一个简单的程序,可以在标准库容器中就地创建对象。 这就是我写的:

#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构造函数调用。 它可能会移动物体,因为它在满载时会调整矢量大小。 移动一个对象很好。 复制对象很昂贵。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM