我需要在我的班级中有一个共享计数器(当计数器变为零时调用某个函数)。
我可以使用带有删除器的shared_ptr<char>
,但这种方法有分配不需要的char
和保持指针的开销。
基本上,我需要引用计数shared_ptr
的一部分。
我不知道如何利用shared_ptr
并避免这种开销。
是否有可移植的C ++ 11实现(即,仅使用标准的c ++ 11和std
,没有显式的互斥锁等)?
PS。 计数器不是整个班级独有的。我可能有我班级的对象a1,a2,a3共享同一个计数器。与b1,b2,b3共享不同的计数器。所以当a1,a2,a3的最后一个超出范围时(与a1,a2,a3相关)应该发生。当b1,b2,b3中的最后一个超出范围时,应该发生某些事情(与b1,b2,b3相关)。
由于
答案 0 :(得分:6)
一个简单的atomic<int>
就足够了。我认为不需要任何更复杂的东西。
答案 1 :(得分:3)
答案 2 :(得分:1)
试试std::shared_ptr<void> ptr = std::make_shared<char>();
。这确实有单字节开销(由于对齐原因可能会进行舍入),但当您使用char
创建make_shared
时,分配的shared_ptr
与引用计数实现在同一个块中}。
另一种方法是使用“退出范围”对象:
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
的开销。