Diferencias entre std:: make unique y std:: unique ptr
¿Tiene std::make_unique
algún beneficio de eficiencia como std::makes_shared
?
Comparado con la construcción manual std::unique_ptr
:
std::make_unique<int>(1); // vs
std::unique_ptr<int>(new int(1));
3 answers
La motivación detrás de make_unique
es principalmente doble: {[13]]}
-
make_unique
es seguro para crear temporarios, mientras que con el uso explícito denew
debe recordar la regla de no usar temporarios sin nombre.foo(make_unique<T>(), make_unique<U>()); // exception safe foo(unique_ptr<T>(new T()), unique_ptr<U>(new U())); // unsafe*
La adición de
make_unique
finalmente significa que podemos decirle a la gente que 'nunca' usenew
en lugar de la regla anterior de "'nunca' usenew
excepto cuando haga ununique_ptr
".
También hay un tercero razón:
-
make_unique
no requiere el uso de tipos redundantes.unique_ptr<T>(new T())
->make_unique<T>()
Ninguna de las razones implica mejorar la eficiencia del tiempo de ejecución de la manera en que se usa make_shared
(debido a evitar una segunda asignación, a costa de un pico de uso de memoria potencialmente más alto).
* Se espera que C++17 incluya un cambio de regla que significa que esto ya no es inseguro. Véanse los documentos del comité de C++ P0400R0 y P0145R3.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-25 12:20:46
std::make_unique
y std::make_shared
están ahí por dos razones:
- Para que no tenga que listar explícitamente los argumentos de tipo de plantilla.
- Seguridad de excepción adicional sobre el uso de constructores
std::unique_ptr
ostd::shared_ptr
. (Véase la sección de Notas aquí.)
No se trata realmente de la eficiencia del tiempo de ejecución. Está el bit sobre el bloque de control y el T
que se asigna todo a la vez, pero creo que es más una ventaja y menos una motivación para que estas funciones existan.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-21 23:31:29
Una razón por la que tendría que usar std::unique_ptr(new A())
o std::shared_ptr(new A())
directamente en lugar de std::make_*()
es no poder acceder al constructor de la clase A
fuera del ámbito actual.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-20 09:16:18