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

boost: Initializing shared pointer reset vs make_shared

本文关键字:make shared 初始化 共享 指针 boost      更新时间:2023-10-16

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

使用reset() 的情况1

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

使用make_shared() 的情况2

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

通常,使用reset而不是make_shared来减小可执行文件的大小是一种好的做法吗?

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

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

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

但如果您使用的是像Microsoft Visual Studio这样的IDE,则有一个小缺点:Intellisense无法向您显示构造函数中使用的参数的名称。代码工作正常,但编辑make_shared()调用不舒服。

make_shared<T>在为T分配的同一内存块中创建引用计数器。这是一种优化。reset不执行此操作。