¿Por qué emplace_back es más rápido que push_back?

pensé queemplace_back sería el ganador al hacer algo como esto:

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

porqueemplace_back construiría el objeto inmediatamente en el vector, mientras quepush_back, primero construiría un objeto anónimo y luego lo copiaría al vector. Para más veresta pregunta.

Google también daesta yesta preguntas

Decidí compararlos para un vector que estaría lleno de enteros.

Aquí está el código del experimento:

#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;
}

El resultado es queemplace_back&nbsp;es más rápido.

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

¿Por qué? La respuesta de la primera pregunta vinculada dice claramente que no habrá diferencia de rendimiento.

También probé con otrosmétodos de tiempo&nbsp;de mi sitio pesudo, pero resultados idénticos.

[EDITAR] Los comentarios dicen que las pruebas conints no dice nada y esopush_back&nbsp;toma una ref.

Hice la misma prueba en el código anterior, pero en lugar deint&nbsp;Tuve una claseA:

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

Resultado:

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

[EDIT.2]

Como dijo denlan, también debería cambiar la posición de las operaciones, así que las cambié y en ambas situaciones (int&nbsp;yclass A),emplace_back&nbsp;fue nuevamente el ganador.

[SOLUCIÓN]

Estaba ejecutando el código endebug mode, que invalida las mediciones. Para la evaluación comparativa, siempre ejecute el código enrelease mode.