Различия между СТД::сделайте уникальный и 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выделяются все сразу, но я думаю, что это больше бонусов и меньше мотивация для существования этих функций.