boost::make_shared中的“single allocation”是什么意思?

9
make_shared的boost文档中,它说:
除了便利和风格外,这样的函数也是异常安全的,并且由于它可以使用单个分配来分配对象及其对应的控制块,因此速度 considerably 更快,消除了 shared_ptr 构造开销的重要部分。
我不理解“单个分配”是什么意思?
2个回答

12

"分配"是指从分配器调用中获取的一块内存。

通常,使用指针构造函数创建一个shared_ptr会为“控制块”分配内存,该块保存引用计数和删除器。该shared_ptr的副本都指向同一个控制块,以便它们共享引用计数。因此总共有两个分配——对象本身和由shared_ptr创建的控制块。

如果您使用make_shared同时创建对象和shared_ptr,那么只会进行一次分配。您可以将其视为具有两个成员的单个结构体:

  1. 正在管理的对象
  2. 控制块。

灵活性的限制在于你不能选择 make_shared 的分配器:它总是 std::allocator。顺便问一句,他们是如何管理 T* 仍然始终在数据结构的顶部的? - Kerrek SB

4

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接