在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
进行编译时会产生不同(甚至更多)的汇编代码。在此处在线检查代码:
我相信编译器输出之间的大部分差异是由于以下事实:对于两个摘要之一,它能够优化更多内容。毕竟,您只需要向变量添加几个常量即可。如果要使优化器的工作更加困难,则输出为nearly identical。那里的编译器不知道foo
的工作方式,必须产生对它的两个调用并将结果添加到x
,没有余地。
要回答您的问题,差别很小。无论如何,unique_ptr
的移动分配运算符都会释放内存,因此在冗余之前调用reset
。但是,从我的链接可以明显看出,如果编译器知道指针已重置,则可能会省略该操作。
但是,如果在分配新的内存之前释放指针所保存的内存,则可以减少程序的内存占用。
[GCC优化器似乎有改进的机会。