Почему emplace_back быстрее push_back?

я думал такemplace_back был бы победителем, когда делал что-то вроде этого:

v.push_back(myClass(arg1, arg2));

так какemplace_back построит объект сразу в векторе, в то время какpush_back, сначала создаст анонимный объект, а затем скопирует его в вектор. Для более см.этот вопрос.

Google также даетэтот а такжеэтот вопросы.

Я решил сравнить их для вектора, который будет заполнен целыми числами.

Вот код эксперимента:

#include <iostream>
#include <vector>
#include <ctime>
#include <ratio>
#include <chrono>

using namespace std;
using namespace std::chrono;

int main() {

  vector<int> v1;

  const size_t N = 100000000;

  high_resolution_clock::time_point t1 = high_resolution_clock::now();
  for(size_t i = 0; i < N; ++i)
    v1.push_back(i);
  high_resolution_clock::time_point t2 = high_resolution_clock::now();

  duration<double> time_span = duration_cast<duration<double>>(t2 - t1);

  std::cout << "push_back took me " << time_span.count() << " seconds.";
  std::cout << std::endl;

  vector<int> v2;

  t1 = high_resolution_clock::now();
  for(size_t i = 0; i < N; ++i)
    v2.emplace_back(i);
  t2 = high_resolution_clock::now();
  time_span = duration_cast<duration<double>>(t2 - t1);
  std::cout << "emplace_back took me " << time_span.count() << " seconds.";
  std::cout << std::endl;

  return 0;
}

Результатом является то, чтоemplace_back быстрее.

push_back took me 2.76127 seconds.
emplace_back took me 1.99151 seconds.

Зачем? Ответ на 1-й связанный вопрос ясно говорит о том, что не будет никакой разницы в производительности.

Также пробовал с другимиметоды времени с моего псевдо-сайта, но идентичные результаты.

[Редактировать] Комментарии говорят, что тестирование сints ничего не говорит и чтоpush_back принимает реф.

Я сделал тот же тест в коде выше, но вместоint У меня был классA:

class A {
 public:
  A(int a) : a(a) {}
 private:
  int a;
};

Результат:

push_back took me 6.92313 seconds.
emplace_back took me 6.1815 seconds.

[EDIT.2]

Как сказал Денлан, я должен также изменить положение операций, поэтому я поменял их местами и в обеих ситуациях (int а такжеclass A),emplace_back снова был победителем.

[РЕШЕНИЕ]

Я запускал код вdebug mode, что делает измерения недействительными. Для бенчмаркинга всегда запускайте код вrelease mode.

Ответы на вопрос(1)

Ваш ответ на вопрос