【问题标题】:How does make_shared allocate single dynamic memory for manager object and managed objectmake_shared 如何为管理器对象和托管对象分配单个动态内存
【发布时间】:2017-02-21 16:12:50
【问题描述】:

make_shared 将动态分配单个内存,从而提高性能。但是它如何为托管对象和控制块使用 new 进行单个内存分配。我想知道内存分配实际上是如何在内部发生的。

【问题讨论】:

  • 没有这样的保证。这只是一个建议。
  • 有什么问题?内部有人会调用::operator new 分配内存。
  • 我同意,但是为 manager 对象做 new 并再次为控制器做 new 将在堆中的不同位置分配内存。它不会是一个单一的内存分配。
  • 它可以只为sizeof(controller) + sizeof(object) + padding 分配原始内存,然后使用placement new 来初始化

标签: c++ c++11 shared-ptr make-shared


【解决方案1】:

make_shared 将动态分配单个内存

请注意,这不是标准要求的。这是可能的,好的实现可以做到这一点。

怎么可能?

例如,它可以通过分配一个未初始化的内存块来实现,该内存块足够大以包含控制块和指向对象,同时考虑到它们的对齐要求,然后使用placement new 构造这两个对象中的每一个。 std::malloc 可用于分配内存。这有点类似于std::vector::reserve 如何分配一块内存,以后可以在其中构造多个对象。

【讨论】:

  • 难道不能创建一个包含控制块和指向对象的struct,而不是使用原始内存块吗?
  • @MarkRansom 也许。我没有足够的信心否认这种方法的可行性。它肯定会使实现更简单。如果我要实现标准库,我会先研究该选项。
  • 传递给make_shared的对象需要以任何一种方式复制。
  • @MarkRansom 当用户单独分配对象时,他们会调用shared_ptr::shared_ptr(Y*) 而不是make_shared,不是吗?也就是说,我删除了我之前的漫无边际。我真的不知道结构是否是一种选择。
  • 我发现尝试实现 make_shared here on stackoverflow 并由 Jonathan Wakely 提供了一个很好的答案,它解决了许多原始问题。这种方法确实使用了结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 2011-02-18
  • 1970-01-01
  • 2010-09-06
相关资源
最近更新 更多