【问题标题】:boost: Initializing shared pointer reset vs make_sharedboost:初始化共享指针重置与 make_shared
【发布时间】:2016-04-07 13:02:10
【问题描述】:

除了生成代码的大小之外,使用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 效率更高。使用它。
  • @KerrekSB,这取决于您如何衡量效率,make_shared 分配更少并减少堆占用,但通常会增加代码大小,这有其自身的成本。 Template Code Bloat Revisited: A Smaller make_shared 读起来很有趣。
  • @KerrekSB “更高效”是什么意思?如果我比较生成的代码量,重置更小。
  • @lucab0ni,但如果计算对malloc 的调用次数,或者从malloc 请求的总大小,那么make_shared 会更小。
  • @JonathanWakely:感谢您的链接!

标签: c++ boost shared-ptr


【解决方案1】:

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

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

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

但是如果您使用的是 Microsoft Visual Studio 之类的 IDE,则存在一个小缺点:Intellisense 无法向您显示构造函数中使用的参数的名称。代码运行正常,但编辑 make_shared() 调用让人不舒服。

【讨论】:

  • 我会对此表示赞同,但最后的建议是武断的,纯粹基于意见。
  • 你是对的。我什至不确定这个建议,所以我没有替换就删除了它。
  • 要获得更好的智能感知行为,请使用 CLion。它比 Visual Studio 或 XCode 好得多
【解决方案2】:

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

【讨论】:

  • "这是一种优化。" 有时它是一种悲观。 ;-]
猜你喜欢
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 2015-10-09
  • 2021-07-03
  • 2017-11-20
相关资源
最近更新 更多