On Tuesday 21 July 2015 17:53:55 Thiago Macieira wrote:
> I'm asking why one of the two would be better than the other if I'm trying
> to  add a single T to std::vector<T>. You've explained that emplace_back
> is efficient, but you haven't said whether push_back is as efficient, more
> efficient or less efficient than that.
> 
> emplace_back will do perfect forwarding without copy direct into the
> vector.  Does push_back do the same?

Best explained with some code:

  template <typename T, [...]>
  class vector {
      T *m_begin, *m_end, *m_capacity;
      // ...
  public:
      void push_back(const T &t) {
          ensureCapacity(size() + 1);
          new (m_end) T(t);                           // copy-construct from t
          ++m_end;
      }
      void push_back(T &&t) {
          ensureCapacity(size() + 1);
          new (m_end) T(std::move(t));                // move-construct from t
          ++m_end;
      }
      template <typename ...Args>
      void emplace_back(Args ...&&args) {
          ensureCapacity(size() + 1);
          new (m_end) T(std::forward<Args>(args)...); // construct with args
          ++m_end;
      }
  };


-- 
Marc Mutz <[email protected]> | Senior Software Engineer
KDAB (Deutschland) GmbH & Co.KG, a KDAB Group Company
Tel: +49-30-521325470
KDAB - The Qt Experts
_______________________________________________
Development mailing list
[email protected]
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to