unique_ptr没有在编译器资源管理器中生成删除指令
unique_ptr not generating delete instruction in Compiler Explorer?
我最近一直在玩编译器资源管理器。我加载了其中一个接受指针参数的例子,并将其更改为接受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
不需要负责调用x
和y
的析构函数;gcc是这样实现的,这就是为什么在代码中没有delete
调用。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 稍后在构造函数中重新启动异常指令删除此指令
- 正在从指令LLVM中删除元数据
- 在llvm中用Undef值替换所有要删除的指令
- unique_ptr没有在编译器资源管理器中生成删除指令