Различия между СТД::сделайте уникальный и std::уникальные ПТР
тут std::make_unique
есть какие-либо преимущества эффективности, как std::makes_shared
?
по сравнению с ручным построением std::unique_ptr
:
std::make_unique<int>(1); // vs
std::unique_ptr<int>(new int(1));
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
существуют ли по двум причинам:
- так что вам не нужно явно перечислять аргументы типа шаблона.
- дополнительная безопасность исключений при использовании
std::unique_ptr
илиstd::shared_ptr
конструкторы. (См. раздел Примечания здесь.)Это не совсем об эффективности выполнения. Есть немного о блоке управления и
T
выделяются все сразу, но я думаю, что это больше бонусов и меньше мотивация для существования этих функций.