我最近一直在玩Compiler Explorer.我加载了一个带有指针参数的示例,并将其更改为取而代之的是unique_ptr参数.但是我注意到在输出程序集中,对操作符删除的调用显然不存在.我很好奇,如果有人知道为什么.
这是一个可以粘贴到资源管理器中的示例.一定要-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];
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:另外作比较,如果不是我在从cppreference示例代码粘贴一个,然后我就得到运营商在输出中删除.
#include <iostream>
#include <memory>
struct Foo
{
Foo() { std::cout << "Foo::Foo\n"; }
~Foo() { std::cout << "Foo::~Foo\n"; }
void bar() { std::cout << "Foo::bar\n"; }
};
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
}
Run Code Online (Sandbox Code Playgroud)
编辑:+1到krzaq.构造和销毁参数的是调用者,而不是被调用者.
这个问题归结为:
void foo(unique_ptr<int>)
{
}
foo(make_unique<int>());
Run Code Online (Sandbox Code Playgroud)
foo参数在哪里?
以下标准与此问题相关:
N4140§5.2.2[expr.call]/4
参数的生命周期在定义它的函数返回时结束.每个参数的初始化和销毁发生在调用函数的上下文中.
换句话说:你maxArray不需要对召唤x和y破坏者负责; gcc以这种方式实现它,这就是deletecodegen 中没有调用的原因.