unique_ptr:在分配之前调用reset的效果是什么

问题描述 投票:3回答:2

在c ++ 14中,分配给现有的unique_ptr有什么区别:

    std::unique_ptr<double> p = std::make_unique<double>(1.0);
    p = std::make_unique<double>(2.0);

并在分配给它之前首先调用reset:?

    std::unique_ptr<double> p = std::make_unique<double>(1.0);
    p.reset();
    p = std::make_unique<double>(2.0);

我以为在赋值之前添加.reset()不会对代码产生太大影响,但是不使用reset()的代码似乎在使用-O3进行编译时会产生不同(甚至更多)的汇编代码。在此处在线检查代码:

https://godbolt.org/z/mBApWH

https://godbolt.org/z/JfStmC

c++ c++14 reset unique-ptr
2个回答
0
投票

我相信编译器输出之间的大部分差异是由于以下事实:对于两个摘要之一,它能够优化更多内容。毕竟,您只需要向变量添加几个常量即可。如果要使优化器的工作更加困难,则输出为nearly identical。那里的编译器不知道foo的工作方式,必须产生对它的两个调用并将结果添加到x,没有余地。

要回答您的问题,差别很小。无论如何,unique_ptr的移动分配运算符都会释放内存,因此在冗余之前调用reset。但是,从我的链接可以明显看出,如果编译器知道指针已重置,则可能会省略该操作。

但是,如果在分配新的内存之前释放指针所保存的内存,则可以减少程序的内存占用。


0
投票

[GCC优化器似乎有改进的机会。

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