2016-04-22 1 views
5
class TestClass { 
    public: 
    TestClass(string s) { 

    } 
    }; 

Quand il y a TestClass, je comprends la différence entre emplace et insérer (emplace constructions en place tandis que les copies d'insertion)C++ Set emplace vs insert lorsqu'un objet est déjà créé

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

Cependant, si est déjà un objet TestClass, en quoi sont-ils différents en termes de mécanisme et de préformance?

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

Répondre

4

emplace fait son travail en transmettant parfaitement ses paramètres au bon constructeur (en utilisant probablement un placement nouveau dans la plupart des implémentations).
De ce fait, dans votre cas, il transmet une référence lvalue et invoque donc probablement le constructeur de la copie.
Quelle est maintenant la différence avec un push_back qui appelle explicitement le constructeur de copie?

Meyers cite aussi cela dans un de ses livres, et il dit qu'il n'y a aucun gain réel en appelant emplace si vous avez déjà une instance de l'objet.

2

utilisation soigneuse des emplace permet le nouvel élément à construire, tout en évitant copie inutile ou déplacer des opérations. Le constructeur du nouvel élément est appelé avec exactement les mêmes arguments que ceux fournis à emplace, expédiez par std :: avant (args) ....

Référence here me porte à croire que cette non "utilisation prudente "conduirait à un mécanisme et à des performances très similaires à ceux de l'insert, dont les détails exacts peuvent être spécifiques au compilateur.