【发布时间】:2014-09-06 22:20:46
【问题描述】:
我很感兴趣这两行代码是否相同:
shared_ptr<int> sp(new int(1)); // double allocation?
shared_ptr<int> sp(make_shared<int>(1)); // just one allocation?
如果这是真的,有人能解释一下为什么第二行只有一个分配吗?
【问题讨论】:
-
要清楚,这不是
int的双重分配。这只是两个独立的分配:一个用于int对象,另一个用于shared_ptr控制块。第二行只是一次性分配int和控制块。 -
在第二种情况下,
make_shared分配了int和控制块,因此可以一次性分配两者。在第一种情况下,您分配了int,shared_ptr的构造函数分配了控制块,没有办法统一分配。 -
注:不能保证
make_shared只进行一次分配,实现只是可能进行一次分配...但是如果您的实现没有执行该优化,您应该向您的供应商投诉(至少 GCC、LLVM 和 MSVC 实现可以做到这一点,boost::make_shared也可以做到) -
这是对幕后情况的另一个体面解释:stackoverflow.com/a/8646062/576911
标签: c++ c++11 smart-pointers make-shared