Различия между std :: make_unique и std :: unique_ptr

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

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

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

    Мотивация make_unique в первую очередь двукратна:

    • make_unique безопасен для создания временных make_unique , тогда как при явном использовании new вы должны помнить правило о том, что вы не используете ненаписанные временные ряды.

       foo(make_unique(), make_unique()); // exception safe foo(unique_ptr(new T()), unique_ptr(new U())); // unsafe* 
    • Добавление make_unique наконец, означает, что мы можем сказать людям, что «никогда» не используют new а не предыдущее правило, «никогда не использовать new кроме случаев, когда вы делаете unique_ptr ».

    Есть и третья причина:

    • make_unique не требует использования избыточного типа. unique_ptr(new T()) -> make_unique()

    Ни одна из причин не связана с повышением эффективности выполнения при использовании make_shared (из-за исключения второго распределения за счет потенциально более высокой пиковой make_shared памяти).

    * Ожидается, что C ++ 17 будет включать изменение правила, что означает, что это уже небезопасно. См. Документы комитета C ++ 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_*() , не может получить доступ к конструктору classа A за пределами текущего объема.

    Давайте будем гением компьютера.