C++ 在已创建对象时设置置入与插入

C++ Set emplace vs insert when an object is already created

本文关键字:插入 设置 创建对象 C++      更新时间:2023-10-16
class TestClass {
    public:
     TestClass(string s) {
     }
   };

当有TestClass时,我了解emplace和insert之间的区别(在插入副本时将构造就地放置)

   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);

emplace通过将其参数完美地转发到正确的构造函数(通过在大多数实现中使用可能的新位置)来完成它的工作。
因此,在您的情况下,它会转发一个左值引用,因此它可能会调用复制构造函数。
现在与显式调用复制构造函数的push_back有什么区别?

迈耶斯在他的一本书中也引用了这一点,他说,如果你已经有一个对象的实例,那么调用emplace就没有实际的好处。

小心使用emplace允许构建新元素,同时避免不必要的复制或移动操作。新元素的构造函数被调用,参数与提供给 emplace 的参数完全相同,通过 std::forward(args)转发。

这里的参考使我相信,这种非"谨慎使用"将导致与插入非常相似的机制和性能,其确切细节可能是特定于编译器的。