Pregunta C ++ Establecer emplace vs insertar cuando un objeto ya está creado


class TestClass {
    public:
     TestClass(string s) {

     }
   };

Cuando hay TestClass, entiendo la diferencia entre emplace e insert (construcciones emplace en su lugar mientras inserta copias)

   set<TestClass> test_set;
   test_set.insert(TestClass("d"));
   test_set.emplace("d");

Sin embargo, si ya existe un objeto TestClass, ¿en qué se diferencian en términos de mecanismo y rendimiento?

   set<TestClass> test_set;
   TestClass tc("e");
   test_set.insert(tc);
   test_set.emplace(tc);

5
2018-04-22 14:37


origen


Respuestas:


emplace funciona perfectamente enviando sus parámetros al constructor correcto (usando probablemente una ubicación nueva en la mayoría de las implementaciones).
Por eso, en su caso reenvía una referencia lvalue y, por lo tanto, invoca probablemente el constructor de copia.
¿Cuál es ahora la diferencia con un push_back que explícitamente llama al constructor de copia?

Meyers también cita eso en uno de sus libros, y dice que no hay una ganancia real en llamar emplace Si ya tienes una instancia del objeto.


5
2018-04-22 17:05



El uso cuidadoso de emplace permite que el nuevo elemento se construya evitando operaciones innecesarias de copiar o mover. El constructor del nuevo elemento se llama con exactamente los mismos argumentos que se proporcionaron para emplace, reenviado a través de std :: forward (args) ...

Referencia aquí me lleva a creer que un uso no tan "cuidadoso" llevaría a un mecanismo y rendimiento muy similar al de la inserción, cuyos detalles exactos pueden ser específicos del compilador.


2
2018-04-22 14:49