Wie*_*ndK 25 c++ g++ std c++11
我编写了一个简单的程序,可以在标准库容器中就地创建对象.这就是我写的:
#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);
};
Run Code Online (Sandbox Code Playgroud)
我用g ++(版本4.8.2)编译它.运行输出后,我得到:
Object created.
Object created.
Object moved.
Object created.
Object moved.
Object moved.
Run Code Online (Sandbox Code Playgroud)
但我期待这样的事情:
Object created.
Object created.
Object created.
Run Code Online (Sandbox Code Playgroud)
我认为进驻的全部意义在于摆脱运动构造函数的召唤.AB类中是否有任何不符合的要求?
谢谢你的帮助.
jua*_*nza 32
问题是,当您添加更多元素时,您的矢量会被调整大小,从而产生额外的移动.如果您在开始时保留足够的容量,则会得到预期的结果:
std::vector< AB > v;
v.reserve(3);
v.emplace_back(1);
v.emplace_back(2);
v.emplace_back(3);
Run Code Online (Sandbox Code Playgroud)
给
Object created.
Object created.
Object created.
Run Code Online (Sandbox Code Playgroud)
在gcc 4.8.2上.请注意,您可以通过查看跟踪矢量在原始代码中的增长情况v.capacity().