c++ - unique_ptr成员 - std:: make_unique和std:: unique_ptr之间的差异




unique_ptr初始化 (2)

std::make_unique是否具有std::make_unique等效率优势?

与手动构建std::unique_ptr相比:

std::make_unique<int>(1);         // vs
std::unique_ptr<int>(new int(1));

make_unique背后的动机主要有两个方面:

  • make_unique对于创建临时make_unique是安全的,而在明确使用new你必须记住关于不使用未命名的临时对象的规则。

    foo(make_unique<T>(), make_unique<U>()); // exception safe
    
    foo(unique_ptr<T>(new T()), unique_ptr<U>(new U())); // unsafe*
    
  • 添加make_unique最终意味着我们可以告诉人们“永远不会”使用new而不是之前的规则来“永远不会”使用new除非你创建unique_ptr “。

还有第三个原因:

  • make_unique不需要冗余类型使用。 unique_ptr<T>(new T()) - > make_unique<T>()

没有任何原因涉及使用make_shared的方式提高运行时效率(由于避免了第二次分配,代价是可能更高的峰值内存使用量)。

*预计C ++ 17将包含规则更改,这意味着这不再是不安全的。 参见C ++委员会论文P0400R0P0145R3


std::make_uniquestd::make_shared有两个原因:

  1. 这样您就不必显式列出模板类型参数。
  2. 使用std::unique_ptrstd::shared_ptr构造函数的额外异常安全性。 (参见here的注释部分。)

它并不是关于运行时效率的。 有一点关于控制块和T被一次性分配,但我认为这更多的是奖励而不是这些功能存在的动机。







c++14