unique_ptr没有在编译器资源管理器中生成删除指令

unique_ptr not generating delete instruction in Compiler Explorer?

本文关键字:删除 指令 资源管理器 编译器 ptr unique      更新时间:2023-10-16

我最近一直在玩编译器资源管理器。我加载了其中一个接受指针参数的例子,并将其更改为接受unique_ptr参数。但我注意到,在输出程序集中,对操作符delete的调用明显缺席。我很好奇有没有人知道为什么。

下面是一个可以粘贴到资源管理器中的示例。一定要把-O3放在编译器选项中。

#include <memory>
using std::unique_ptr;
void maxArray(unique_ptr<double[]> x, unique_ptr<double[]> y) {
    for (int i = 0; i < 65536; i++) {
        if (y[i] > x[i]) x[i] = y[i];
    }
}

编辑:同样为了比较,如果我粘贴cppreference中的一个代码示例,那么我在输出中得到operator delete。

#include <iostream>
#include <memory>
struct Foo
{
    Foo()      { std::cout << "Foo::Foon";  }
    ~Foo()     { std::cout << "Foo::~Foon"; }
    void bar() { std::cout << "Foo::barn";  }
};
void f(const Foo &)
{
    std::cout << "f(const Foo&)n";
}
int main()
{
    std::unique_ptr<Foo> p1(new Foo);  // p1 owns Foo
    if (p1) p1->bar();
    {
        std::unique_ptr<Foo> p2(std::move(p1));  // now p2 owns Foo
        f(*p2);
        p1 = std::move(p2);  // ownership returns to p1
        std::cout << "destroying p2...n";
    }
    if (p1) p1->bar();
    // Foo instance is destroyed when p1 goes out of scope
}

编辑:+1到krzaq。是调用方而不是被调用方构造和销毁参数。

这个问题归结为:

void foo(unique_ptr<int>)
{
}
foo(make_unique<int>());

foo的参数在哪里?

下列标准与这个问题有关:

N4140§5.2.2 [expr.call]/4

形参的生存期在它所在的函数结束时结束定义的回报。每个参数的初始化和销毁在调用函数的上下文中发生。

换句话说:你的maxArray不需要负责调用xy的析构函数;gcc是这样实现的,这就是为什么在代码中没有delete调用。