std :: make_unique和std :: unique_ptr之间的区别
std::make_unique
是否有像std::makes_shared
一样的效率好处?
与手动构buildstd::unique_ptr
相比:
std::make_unique<int>(1); // vs std::unique_ptr<int>(new int(1));
make_unique
背后的动机主要有两方面:
-
make_unique
对于创build临时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
的join最终意味着我们可以告诉人们“永不”使用new
而不是以前的规则来“永不”使用new
除非你做了一个unique_ptr
“。
还有第三个原因:
-
make_unique
不需要冗余types的用法。unique_ptr<T>(new T())
– >make_unique<T>()
没有一个原因涉及到使用make_shared
的方式提高运行时效率(由于避免了第二次分配,代价是可能存在更高的峰值内存使用量)。
*预计C ++ 17将包含规则更改,这意味着这不再不安全。 请参阅C ++委员会文件P0400R0和P0145R3 。
std::make_unique
和std::make_shared
有两个原因:
- 所以你不必显式地列出模板types参数。
- 额外的使用
std::unique_ptr
或std::shared_ptr
构造函数的安全性。 (请看这里的注释部分。)
这不是关于运行效率。 有一点关于控制块和T
被一次性分配,但我认为这是更多的奖金,而不是这些function存在的动机。
你必须直接使用std::unique_ptr(new A())
或std::shared_ptr(new A())
而不是std::make_*()
原因是无法访问类A
的构造函数目前的范围。