Differences between std::make

Does std::make_unique have any efficiency benefits like std::makes_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_unique is safe for creating temporaries, whereas with explicit use of new you 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_unique finally means we can tell people to 'never' use new rather than the previous rule to "'never' use new except when you make a unique_ptr ".

  • There's also a third reason:

  • make_unique does 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_ptr or std::shared_ptr constructors. (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.


    你必须直接使用std::unique_ptr(new A())std::shared_ptr(new A())而不是std::make_*()原因是无法访问类A的构造函数目前的范围。

    链接地址: http://www.djcxy.com/p/78496.html

    上一篇: Malloc vs新

    下一篇: std :: make之间的区别