问题描述
我了解到在大多数情况下 emplace_back 会比 push_back 更快,例如 emplace_back("aa") 与 push_back("aa")。人们这么说是因为 emplace_back 是新元素的就地构造。
但是,我找到了有关 emplace_back 和 push_back 的代码。我的 g++ 版本是 'g++5'
#if __cplusplus >= 201103L
template<typename _Tp,typename _Alloc>
template<typename... _Args>
void
vector<_Tp,_Alloc>::
emplace_back(_Args&&... __args)
{
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
{
_Alloc_traits::construct(this->_M_impl,this->_M_impl._M_finish,std::forward<_Args>(__args)...);
++this->_M_impl._M_finish;
}
else
_M_emplace_back_aux(std::forward<_Args>(__args)...);
}
#endif
void
push_back(const value_type& __x)
{
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
{
_Alloc_traits::construct(this->_M_impl,__x);
++this->_M_impl._M_finish;
}
else
#if __cplusplus >= 201103L
_M_emplace_back_aux(__x);
#else
_M_insert_aux(end(),__x);
#endif
}
在我看来,对于 c++11(或更高版本),它们之间的唯一区别是 std::forward
,意味着 emplace_back 会将输入类型转换为 'rvalue reference',只要它不是 'lvalue参考'。但我没有注意到这与“就地构造”之间的联系。
另外,c++委员会为什么不立即修改push_back的实现,而是增加一个新的函数(emplace_back)?
你能告诉我吗?谢谢!
裴牧
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)