Различия между СТД::сделайте уникальный и std::уникальные ПТР


тут std::make_unique есть какие-либо преимущества эффективности, как std::makes_shared?

по сравнению с ручным построением std::unique_ptr:

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

3 ответа:

мотивация 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 будет включать изменение правила, которое означает, что это больше не так опасный. Ознакомиться с документами комитета++P0400R0 и P0145R3.

std::make_unique и std::make_shared существуют ли по двум причинам:

  1. так что вам не нужно явно перечислять аргументы типа шаблона.
  2. дополнительная безопасность исключений при использовании std::unique_ptr или std::shared_ptr конструкторы. (См. раздел Примечания здесь.)

Это не совсем об эффективности выполнения. Есть немного о блоке управления и T выделяются все сразу, но я думаю, что это больше бонусов и меньше мотивация для существования этих функций.

причина, по которой вам придется использовать std::unique_ptr(new A()) или std::shared_ptr(new A()) вместо std::make_*() не удается получить доступ к конструктору класса A вне текущего объема.