Observando a saída do assembly da seguinte função C++ simples:
#include <memory>
int square(std::unique_ptr<int> num) {
return *num * *num;
}
Gcc e clang emitem o seguinte assembly ( -O2
):
square(std::unique_ptr<int, std::default_delete<int> >):
mov rax, QWORD PTR [rdi]
mov eax, DWORD PTR [rax]
imul eax, eax
ret
Isso foi muito inesperado para mim: para onde o destruidor está sendo chamado?
O MSVC, por outro lado, faz o que eu esperava e chama o destruidor.
Aqui está uma reprodução de godbolt: https://godbolt.org/z/e66xh9Yos
Também tentei usar tipos maiores int
para ver se é alguma otimização de tamanho pequeno, mas não pareceu ser o caso.
Alguém pode explicar o que está acontecendo aqui?