为什么按值获取 std::unique_ptr 的函数不调用 gcc/clang 中的析构函数?

问题描述 投票:0回答:1

查看以下简单 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
更大的类型来看看它是否是一些小尺寸优化, 但事实似乎并非如此。

有人能解释一下这是怎么回事吗?

c++ assembly language-lawyer unique-ptr
1个回答
0
投票

未指定函数参数对象是在函数返回时销毁还是在包含函数调用的完整表达式末尾销毁。

换句话说,调用者或被调用者是否负责调用析构函数是 ABI 决定的。该标准明确未指定支持这两个 ABI 决策。

另请注意,调用构造函数始终是调用者的责任。因此调用者可以像被调用者一样调用析构函数。

© www.soinside.com 2019 - 2024. All rights reserved.