查看以下简单 C++ 函数的汇编输出:
#include <memory>
int square(std::unique_ptr<int> num) {
return *num * *num;
}
Gcc 和 clang 发出以下程序集 ( -O2
):
square(std::unique_ptr<int, std::default_delete<int> >):
mov rax, QWORD PTR [rdi]
mov eax, DWORD PTR [rax]
imul eax, eax
ret
这对我来说非常出乎意料:析构函数在哪里被调用?
另一方面,MSVC 执行了我所期望的操作,并调用析构函数。
这是 Godbolt 重现:https://godbolt.org/z/e66xh9Yos
我还尝试使用更大的类型来int
查看是否是一些小尺寸优化,但情况似乎并非如此。
有人能解释一下这是怎么回事吗?