查看以下简单 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
更大的类型来看看它是否是一些小尺寸优化,
但事实似乎并非如此。
有人能解释一下这是怎么回事吗?
未指定函数参数对象是在函数返回时销毁还是在包含函数调用的完整表达式末尾销毁。
换句话说,调用者或被调用者是否负责调用析构函数是 ABI 决定的。该标准明确未指定支持这两个 ABI 决策。
另请注意,调用构造函数始终是调用者的责任。因此调用者可以像被调用者一样调用析构函数。