本记录之智能指针shared_ptr 中引用技术模块的相关实现细节
1. 前言
在之前的文章(链接)中通过实现简易版本的智能指针梳理了其内部的原理,但是实现细节上还不够完整。平时多实现一些单一功能的类对提升工作效率是有帮助的, 本文就来实现支持多线程的引用计数类。
2. 代码实现
计数类型用 int , 在实际开发中对引用计数常用的运算符是 ++ 和 - -,所以至少要重载这两个运算符。线程数据同步就不用 mutex 锁了,直接使用标准库中的 atomic 原子操作模板类, 毕竟大量行业前辈已经证明前者的效率比后者底了嘛(哈哈哈)。
class CEXRefCounter
{
public:
//无参数构造,计数初始化为0
CEXRefCounter():m_count(0){};
//禁止隐式自动转换为 CEXRefCounter
explicit CEXRefCounter(int init_value):m_count(init_value){};
//拷贝构造
CEXRefCounter(const CEXRefCounter& another)
:m_count(another.value())
{};
//没有暴露的资源类指针,析构函数直接默认
~CEXRefCounter() = default;
//赋值运算符重载
CEXRefCounter& operator = (const CEXRefCounter& another)
{
m_count.store(another.value);
return *this;
};
CEXRefCounter& operator = (int value)
{
m_count.store(value);
return *this;
};
//转换为 int 类型
operator int() const
{
return m_count.load();
};
// 获取当前计数
int value() const
{
return m_count.load();
}
// 前 ++
int operator ++ ()
{
return ++m_count;
};
// 后 ++
int operator ++ (int)
{
return m_count++;
};
//前--
int operator -- ()
{
return --m_count;
};
// 后--
int operator -- (int)
{
return m_count--;
};
// 重载 if 中使用的逻辑符
operator bool () const
{
return 0 != m_count.load();
};
private:
std::atomic<int> m_count;
};
3. 总结
简单明了实用。哈哈哈