visual studio microsoft español descargar community c++ assembly smart-pointers

c++ - studio - ¿Por qué la instanciación unique_ptr se compila en un binario mayor que un puntero sin formato?



visual studio installer (1)

Porque std::make_unique<int[]>(100) realiza la inicialización del valor mientras que el new int[100] realiza la inicialización predeterminada - En el primer caso, los elementos se inicializan en 0 (para int ), mientras que en el segundo caso los elementos se dejan sin inicializar . Tratar:

int *p = new int[100]();

Y obtendrás el mismo resultado que con std::unique_ptr .

Ver this por ejemplo, que establece que std::make_unique<int[]>(100) es equivalente a:

std::unique_ptr<T>(new int[100]())

Si desea una matriz no inicializada con std::unique_ptr , puede usar 1 :

std::unique_ptr<int[]>(new int[100]);

1 Como mencionó @Ruslan en los comentarios, tenga en cuenta la diferencia entre std::make_unique() y std::unique_ptr() - Vea las @Ruslan .

Siempre tuve la impresión de que std::unique_ptr no tenía sobrecarga en comparación con el uso de un puntero sin formato. Sin embargo, compilando el siguiente código

#include <memory> void raw_pointer() { int* p = new int[100]; delete[] p; } void smart_pointer() { auto p = std::make_unique<int[]>(100); }

con g++ -std=c++14 -O3 produce el siguiente ensamblaje:

raw_pointer(): sub rsp, 8 mov edi, 400 call operator new[](unsigned long) add rsp, 8 mov rdi, rax jmp operator delete[](void*) smart_pointer(): sub rsp, 8 mov edi, 400 call operator new[](unsigned long) lea rdi, [rax+8] mov rcx, rax mov QWORD PTR [rax], 0 mov QWORD PTR [rax+392], 0 mov rdx, rax xor eax, eax and rdi, -8 sub rcx, rdi add ecx, 400 shr ecx, 3 rep stosq mov rdi, rdx add rsp, 8 jmp operator delete[](void*)

¿Por qué la salida para smart_pointer() casi tres veces más grande que raw_pointer() ?