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

    } 
    }; 

當存在識別TestClass,我明白布設之間的差,並插入(在適當位置佈設構建體而插入拷貝)C++集佈設VS插入件當一個對象已經創建

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

然而,如果有已經是一個TestClass對象,它們在機制和性能方面有什麼不同?

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

回答

4

emplace通過將其參數完美轉發給正確的構造函數(通過使用可能的大部分實現中的新放置)來完成其工作。
因此,在你的情況下,它轉發一個左值引用,因此它可能調用複製構造函數。
push_back明確調用複製構造函數的區別是什麼?如果你已經有一個對象的實例,邁爾斯還引用了他的一本書,他說如果調用emplace沒有實際的收益。

2

謹慎使用佈設的允許構建新的元件,同時避免不必要的複製或移動操作。新元素的構造函數被調用完全一樣提供給佈設,通過的std ::前進(參數)轉發相同的參數....

參考here使我相信,這樣的非「謹慎使用「會導致與插入非常相似的機制和性能,其確切的細節可能是編譯器特定的。

相關問題