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

    } 
    }; 

erstellt wird, wenn es Testclass ist, verstehe ich den Unterschied zwischen emplace und Einsatz (emplace Konstrukte an Ort und Stelle, während Einsatz Kopien)C++ Set vs Einsatz einzulagern, wenn ein Objekt bereits

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

Wenn es jedoch ist bereits ein TestClass-Objekt, wie unterscheiden sie sich in Bezug auf Mechanismus und Leistung?

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

Antwort

4

emplace funktioniert durch die perfekte Weiterleitung seiner Parameter an den richtigen Konstruktor (durch die Verwendung einer Platzierung wahrscheinlich neu in den meisten Implementierungen).
Aus diesem Grund leitet es in Ihrem Fall eine lvalue-Referenz und damit wahrscheinlich den Kopierkonstruktor aufruft.
Was ist nun der Unterschied mit einer push_back, die den Kopierkonstruktor explizit aufruft?

Meyers zitiert auch, dass in einem seiner Bücher, und er sagt, dass es keinen tatsächlichen Gewinn beim Aufruf emplace, wenn Sie bereits eine Instanz des Objekts haben.

2

sorgfältige Verwendung von emplace ermöglicht das neue Element konstruiert werden, während unnötige Kopie zu vermeiden oder Operationen bewegen. Der Konstruktor des neuen Elements ist mit genau den gleichen Argumenten aufgerufen wie emplace zugeführt, über std :: weitergeleitet vorwärts (args) ....

Referenz here führt mich, dass solche nicht "sorgsamen Umgang zu glauben, "würde zu einem sehr ähnlichen Mechanismus und einer ähnlichen Leistung führen wie die Einfügung, deren genaue Details compilerspezifisch sein können.