Does std::make_unique have any efficiency benefits like std::make_shared?
Compared to manually constructing std::unique_ptr:
std::make_unique<int>(1); // vs
std::unique_ptr<int>(new int(1));
The motivation behind make_unique is primarily two-fold:
make_uniqueis safe for creating temporaries, whereas with explicit use ofnewyou have to remember the rule about not using unnamed temporaries.foo(make_unique<T>(), make_unique<U>()); // exception safe foo(unique_ptr<T>(new T()), unique_ptr<U>(new U())); // unsafe*The addition of
make_uniquefinally means we can tell people to 'never' usenewrather than the previous rule to "'never' usenewexcept when you make aunique_ptr".
There's also a third reason:
make_uniquedoes not require redundant type usage.unique_ptr<T>(new T())->make_unique<T>()
None of the reasons involve improving runtime efficiency the way using make_shared does (due to avoiding a second allocation, at the cost of potentially higher peak memory usage).
* It is expected that C++17 will include a rule change that means that this is no longer unsafe. See C++ committee papers P0400R0 and P0145R3.
std::make_unique and std::make_shared are there for two reasons:
- So that you don't have to explicitly list the template type arguments.
- Additional exception safety over using
std::unique_ptrorstd::shared_ptrconstructors. (See the Notes section here.)
It's not really about runtime efficiency. There is the bit about the control block and the T being allocated all at once, but I think that's more a bonus and less a motivation for these functions to exist.
A reason why you would have to use std::unique_ptr(new A()) or std::shared_ptr(new A()) directly instead of std::make_*() is being unable to access the constructor of class A outside of current scope.
来源:https://stackoverflow.com/questions/22571202/differences-between-stdmake-unique-and-stdunique-ptr-with-new