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()
调用很不舒服。
除了生成代码的大小,使用 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()
调用很不舒服。