【问题标题】:Implementing reference counting实现引用计数
【发布时间】:2015-11-01 16:54:30
【问题描述】:

我正在开发一个使用多个(比如 5M)对象的应用程序。

每个对象都由单个std::shared_ptr 组成,它指向内存中的blob。每个内存blob 都有不同的大小。

我想最小化分配,所以我想做类似std::make_sharedstd::allocate_shared 的事情,这样就可以进行单一分配。

这似乎是不可能的(使用 Boost 可能是可能的)
make_shared with custom new operator

下一个选项是自己实现 ref count :) 。我知道这根本不容易,最好有两个分配,而不是一些隐藏的错误,但我想探索这种可能性。

有没有类似的现成实现?

我也可以找到这个:
https://isocpp.org/wiki/faq/freestore-mgmt#ref-count-simple

【问题讨论】:

  • 请使用c++ 标签。无论如何,要求图书馆是题外话。
  • 听起来您真的想要自己的内存管理系统,而不是引用计数系统(XY 问题)。而且我怀疑你能比你的编译器供应商做得更好。
  • @JonathanPotter - 这真的很有帮助:)

标签: c++ c++11 shared-ptr smart-pointers reference-counting


【解决方案1】:

看起来,使用自定义分配器的 allocate_shared 确实是您的答案。

编写分配器并非易事,但也不是那么困难。这个概念在这里阐述:

http://en.cppreference.com/w/cpp/concept/Allocator

在谷歌上快速搜索“c++ memory pool allocator”发现了一些现成的例子,例如:

http://www.boost.org/doc/libs/1_58_0/libs/pool/doc/html/boost_pool/pool/interfaces.html

(在本页搜索“池分配器”)

【讨论】:

  • 我在其他问题中试过这个,但我没有找到可靠的方法将对象大小传递给分配器 - stackoverflow.com/questions/31904439/… 。我发布的代码有效,但很糟糕。
  • 不确定我是否理解。 allocator<T> 将有一个名为 allocate(n) 的方法,该方法将为 n 个 T 类型的对象分配内存。allocator 知道 T 的大小,因为它可以在后台调用 sizeof(T)
  • T 具有可变大小。 sizeof() 报告的大小总是错误的。
  • @Nick 你一定有什么误解。 T 是一个模板,它代表“某个对象”。每次 T 表示给定对象时,它将是相同的大小。你想达到什么目的?所有内存的预分配或动态池分配(即在最后一次释放所有内存)?
  • 请检查一下,有点长,但我不能做得更短。 programmers.stackexchange.com/questions/293349/…
【解决方案2】:

不需要做任何工作。如果我理解正确,那么您正在寻找的是 boost intrusive_ptr,http://www.boost.org/doc/libs/1_58_0/libs/smart_ptr/intrusive_ptr.html

每个对象只分配一次引用计数。

【讨论】:

  • make_shared 也只进行一次分配——它将对象和控制块分配为单个元组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多