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()
?