C++11 emplace_back是否在新位置构造对象而不是使用移动?
从链接it状态 例如,在我们开始的代码中,my_vec.push_back(“foo”) 从字符串文本构造一个临时字符串,然后移动 将字符串插入容器中,而我的向量放回(“foo”) 只需直接在容器中构造字符串,避免 额外的动作。对于更昂贵的类型,这可能是使用 尽管可读性和 安全成本,但也可能不会。很多时候,表演 不同并不重要 所以我决定试试,这就是我所做的C++11 emplace_back是否在新位置构造对象而不是使用移动?,c++11,C++11,从链接it状态 例如,在我们开始的代码中,my_vec.push_back(“foo”) 从字符串文本构造一个临时字符串,然后移动 将字符串插入容器中,而我的向量放回(“foo”) 只需直接在容器中构造字符串,避免 额外的动作。对于更昂贵的类型,这可能是使用 尽管可读性和 安全成本,但也可能不会。很多时候,表演 不同并不重要 所以我决定试试,这就是我所做的 class foo { public: int counter; foo() { std::
class foo
{
public:
int counter;
foo()
{
std::cout << "Regular constructor\n";
}
foo(const foo& f)
{
std::cout << "Copy constructor\n";
}
foo(foo&& f)
{
std::cout << "Move constructor\n";
}
};
int main()
{
std::vector<foo> f;
f.push_back(foo()); //Regular constructor and Move Constructor
f.emplace_back(foo()); //Regular constructor and Move Constructor
}
class-foo
{
公众:
整数计数器;
foo()
{
std::coutvector::emplace_back(Args&&…
获取您要用来构造新对象的构造函数的参数。在您引用的示例中,这是构造函数string::string(const char*)的const char*
。在您自己的代码中,您通过传递一个临时对象来强制移动构造函数。若要在原地默认构造对象,请使用f.emplace\u back()
,不带任何参数,因为默认构造函数不带任何参数
另外,为了避免重新分配(可能更多的移动会破坏您的测试),请首先使用f.reserve(2)
确保向量有空间放置两个测试对象
完整代码:
class foo
{
public:
foo()
{
std::cout << "Default constructor\n";
}
foo(const foo& f)
{
std::cout << "Copy constructor\n";
}
foo(foo&& f)
{
std::cout << "Move constructor\n";
}
};
int main()
{
std::vector<foo> f;
f.reserve(2);
f.push_back(foo());
f.emplace_back();
}
谢谢你的澄清。我不知道emplace_back允许默认构造
Default constructor
Move constructor
Default constructor