引用计数(不存储任何数据)
Reference counting (without storing any data)
我需要在我的类中有一个共享计数器(当计数器变为零时调用某个函数)。为此,我可以使用带有删除器的shared_ptr<char>
,但这种方法的开销是分配不需要的char
并保留指向它的指针。
基本上,我需要shared_ptr
的引用计数部分。我不知道如何利用shared_ptr
并避免这种开销。
是否有共享计数器的可移植C++11实现(即仅使用标准c ++ 11和std
,没有显式互斥体等)?
附言。计数器并非整个类所独有。我的类可能有对象 a1、a2、a3 共享同一个计数器。和共享不同计数器的 b1、b2、b3。因此,当 a1、a2、a3 中的最后一个超出范围时,应该会发生一些事情(与 a1、a2、a3 相关)。当 b1、b2、b3 的最后一个超出范围时,应该会发生一些事情(与 b1、b2、b3 相关)。
谢谢
一个简单的
atomic<int>
就足够了。我认为不需要更复杂的东西。
std::shared_ptr<void> p(nullptr, MyDeleter());
这完全符合您的要求。
现场示例
尝试std::shared_ptr<void> ptr = std::make_shared<char>();
. 这确实具有单个字节开销(可能出于对齐原因而四舍五入),但是当您使用 make_shared
创建shared_ptr
时,分配的char
与引用计数实现位于同一块中。
另一种方法是使用"在退出范围"对象:
struct at_exit_scope {
std::function<void()> f;
~at_exit_scope() { f(); }
template<typename F>
at_exit_scope( F&& f_ ):f(std::forward<F>(f_)) {}
at_exit_scope() = delete;
at_exit_scope(at_exit_scope const&) = delete;
};
然后做一个shared_ptr<at_exit_scope> ptr = std::make_shared<at_exit_scope>( [=]{ /* code */ } )
. 这消除了对deleter
的需要,并用std::function
的开销代替了它。
相关文章:
- 从输入中删除重复项,而不使用任何数据结构
- 有没有办法在函数 c++ 中输入任何数据类型?
- 我们可以直接为任何数据成员赋值. 为什么要使用构造函数?
- glGetBufferSubData() 不返回任何数据?
- 字符串流在清除后不接受任何数据
- GLSL 计算着色器 使用查找表设置缓冲区会导致不写入任何数据,与其他数据设置相同的缓冲区有效
- C 通用函数以除以任何数据类型
- 我可以通过向量附加特征矩阵而不复制任何数据
- 是否有任何数据类型或方法可以计算当前单元格中先前数组单元格的总和
- 将任何数据类型/对象作为参数传递以确定其大小
- 是否要确保一个线程修改的任何数据类型的共享变量对其他线程可见
- RAW ICMP 套接字:recvfrom() 未接收任何数据
- stl 中是否有任何数据结构可以在 O(1) 或 O(log n) 中插入元素,我可以在其上编写自己的bin_searc
- 为什么我的C++ ZeroMQ 订阅者没有收到任何数据
- Adafruit Fona与echo服务器建立连接,但不发送任何数据
- 为什么字符串变量"sum"不存储任何数据,程序不给出任何输出
- 难以创建可以容纳任何数据类型的模板通用向量
- 没有任何数据成员的类会导致内存泄漏吗?
- 引用计数(不存储任何数据)
- CLOB 不包含任何数据