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