为什么 emplace_back 是一个就地构造而 push_back 不是?

问题描述

我了解到在大多数情况下 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 (将#修改为@)