除了生成代码的大小之外,使用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
来减少可执行文件的大小是一种好习惯吗?
答案 0 :(得分:8)
reset(new T(...))
分配堆块,构造对象,为引用计数器分配新的堆块并初始化引用计数器。
make_shared<T>(...)
分配一个稍大于对象所需的堆块,并在同一个堆块中构造对象和引用计数器。
make_shared()
运行得更快并且需要更少内存的可能性很高。
但如果您使用的是像Microsoft Visual Studio这样的IDE,则存在一个小缺点:Intellisense无法显示构造函数中使用的参数的名称。代码工作正常,但编辑make_shared()
电话很不舒服。
答案 1 :(得分:3)
make_shared<T>
在为T分配的同一块内存中创建引用计数器。它是一种优化。 reset
不会这样做。