在make_shared的 boost 文档中,它说:
除了方便和风格之外,这样的函数也是异常安全的,并且速度相当快,因为它可以对对象及其相应的控制块使用单个分配,从而消除了 shared_ptr 构造开销的很大一部分。
我不明白“单一分配”的含义,这是什么意思?
在make_shared的 boost 文档中,它说:
除了方便和风格之外,这样的函数也是异常安全的,并且速度相当快,因为它可以对对象及其相应的控制块使用单个分配,从而消除了 shared_ptr 构造开销的很大一部分。
我不明白“单一分配”的含义,这是什么意思?
“分配”是指通过调用分配器获得的内存块。
通常,shared_ptr
使用指针构造函数创建 a 会为“控制块”分配内存,其中包含引用计数和删除器。所有的副本shared_ptr
都引用同一个控制块,因此它们共享引用计数。因此,总共有两个分配 - 对象本身和由shared_ptr
.
如果创建对象并与shared_ptr
一起make_shared
,则只进行一次分配。您可以将其视为具有两个成员的单个结构:
shared_ptr
需要为引用计数分配空间。这意味着您将动态创建对象(一次分配)并将其传递给shared_ptr
将依次分配计数(第二次分配)的对象。make_shared
执行一次足够大的分配,然后在适当的位置构造计数和对象。