9

make_shared的 boost 文档中,它说:

除了方便和风格之外,这样的函数也是异常安全的,并且速度相当快,因为​​它可以对对象及其相应的控制块使用单个分配,从而消除了 shared_ptr 构造开销的很大一部分。

我不明白“单一分配”的含义,这是什么意思?

4

2 回答 2

12

“分配”是指通过调用分配器获得的内存块。

通常,shared_ptr使用指针构造函数创建 a 会为“控制块”分配内存,其中包含引用计数和删除器。所有的副本shared_ptr都引用同一个控制块,因此它们共享引用计数。因此,总共有两个分配 - 对象本身和由shared_ptr.

如果创建对象并与shared_ptr一起make_shared,则只进行一次分配。您可以将其视为具有两个成员的单个结构:

  1. 被管理的对象
  2. 控制块。
于 2011-08-12T17:53:01.023 回答
4

shared_ptr需要为引用计数分配空间。这意味着您将动态创建对象(一次分配)并将其传递给shared_ptr将依次分配计数(第二次分配)的对象。make_shared执行一次足够大的分配,然后在适当的位置构造计数和对象。

于 2011-08-12T17:50:48.970 回答