¿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 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 de mi sitio pesudo, pero resultados idénticos.

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

Hice la misma prueba en el código anterior, pero en lugar deint 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 yclass A),emplace_back 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.

Respuestas a la pregunta(1)

Su respuesta a la pregunta