boost:初始化共享指针重置 vs make_shared

boost: Initializing shared pointer reset vs make_shared

除了生成代码的大小,使用 reset() 初始化函数 make_shared() 上的共享指针有什么区别?

案例 1 使用 reset()

boost::shared_ptr<A> pA;
pA.reset(new A());

案例 2 使用 make_shared()

boost::shared_ptr<A> pA;
pA = boost::make_shared<A>();

一般来说,使用 reset 而不是 make_shared 来减小可执行文件的大小是一个好习惯吗?

make_shared<T> 在分配给 T 的相同内存块中创建引用计数器。这是一种优化。 reset 不会这样做。

reset(new T(...))分配一个堆块,构造对象,为引用计数器分配一个新的堆块并初始化引用计数器。

make_shared<T>(...)分配一个比对象所需的稍大的堆块,并在同一个堆块中构造对象和引用计数器。

很有可能 make_shared() 运行得更快并且需要更少的内存。

但是有一个小缺点如果你使用像微软IDE这样的Visual Studio:Intellisense 不能显示你的名字构造函数中使用的参数。代码工作正常,但编辑 make_shared() 调用很不舒服。