如何解决emplace_back是否在新位置构造对象而不是使用移动?
从this链接显示状态
例如,在我们开始的代码中,my_vec.push_back(“ foo”) 从字符串文字构造一个临时字符串,然后移动 该字符串到容器中,而my_vec.emplace_back(“ foo”) 只是直接在容器中构造字符串,避免了 额外的动作。对于更昂贵的类型,这可能是使用的原因 尽管可读性强,但使用emplace_back()而不是push_back() 安全成本,但事实并非如此。很多时候表现 差异无所谓
所以我决定尝试一下,这就是我所做的
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
}
我注意到push_back
和emplace_back
的行为相似。我本以为emplace_back
只会根据我所读的内容调用常规构造函数,因为它将在向量堆栈中构造。
解决方法
vector::emplace_back(Args&&...)
接受您要用来构造新对象的构造函数的参数。在您引用的示例中,对于构造函数const char*
,这是string::string(const char*)
。在您自己的代码中,您通过传递临时对象来强制移动构造函数。要就地默认构造对象,请使用f.emplace_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();
}
输出为
Default constructor
Move constructor
Default constructor
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。