关于Android的轻指针

前言

之前对于c++语言不是特别熟悉,遇到很多问题,现在准备好好研究Android的系统,这里好好研究下这个东西。其实这里仅仅是用来记录下自己的思路,这里主要和Java语言比较,

正文

首先是轻指针,轻指针仅仅是用来记录有多少指针指向当前向量,首先我们的需要一个接口,也就是一个基类,首先要定义一个mCount变量,可是如果我们在这个接口中直接对这个函数进行函数重载,或者友元的处理,就会影响当前类的一些操作,这里我们大概用了一个类似Java中的工具类,让工具类持有我们目标类的操作记录然后记录使用次数,这里我们先来看下这个基类,

template <class T>
class LightRefBase  //这是一个模板类,类似接口。
{
public:
    inline LightRefBase() : mCount(0) { }   //构造函数,mCount位0,
    inline void incStrong(__attribute__((unused)) const void* id) const {
        __sync_fetch_and_add(&mCount, 1);
    }
    inline void decStrong(__attribute__((unused)) const void* id) const {
        if (__sync_fetch_and_sub(&mCount, 1) == 1) {
            delete static_cast<const T*>(this);
        }
    }
    //! DEBUGGING ONLY: Get current strong ref count.
    inline int32_t getStrongCount() const {
        return mCount;
    }

    typedef LightRefBase<T> basetype;

protected:
    inline ~LightRefBase() { }

private:
    friend class ReferenceMover;
    inline static void moveReferences(void*, void const*, size_t,
            const ReferenceConverterBase&) { }

private:
    mutable volatile int32_t mCount;
};

同时这也是一个模板类,这样可以不用集成,即可让你的类拥有了轻指针的特性,至于模板类,当然是为了为了清理内存,因为我们的类没如果想从内存中消除需要知道是哪个类,这里其实没什么复杂的,早incStrong,和decStrong,这里不要过分里面Gcc特特性,基本可以无视,知道是增加指针计数,和减少指针计数。至于哪个工具类,sp,就不比较复杂了,这里我们不要关注里面的东西,只要知道大概远离即可,我也不想过分在c++特性纠结,毕竟比较复杂,特别是操作符的复写和友元的使用。

template <typename T>
class sp
{
public:
    inline sp() : m_ptr(0) { }

    sp(T* other);
    sp(const sp<T>& other);
    template<typename U> sp(U* other);
    template<typename U> sp(const sp<U>& other);

    ~sp();

    // Assignment

    sp& operator = (T* other);
    sp& operator = (const sp<T>& other);

    template<typename U> sp& operator = (const sp<U>& other);
    template<typename U> sp& operator = (U* other);

    //! Special optimization for use by ProcessState (and nobody else).
    void force_set(T* other);

    // Reset

    void clear();

    // Accessors

    inline  T&      operator* () const  { return *m_ptr; }
    inline  T*      operator-> () const { return m_ptr;  }
    inline  T*      get() const         { return m_ptr; }

    // Operators

    COMPARE(==)
    COMPARE(!=)
    COMPARE(>)
    COMPARE(<)
    COMPARE(<=)
    COMPARE(>=)

private:
    template<typename Y> friend class sp;
    template<typename Y> friend class wp;
    void set_pointer(T* ptr);
    T* m_ptr;
};

这里我们只要知道,关注下构造函数:

template<typename T>
sp<T>::sp(T* other)
: m_ptr(other)
  {
    if (other) other->incStrong(this);
  }

template<typename T>
sp<T>::sp(const sp<T>& other)
: m_ptr(other.m_ptr)
  {
    if (m_ptr) m_ptr->incStrong(this);
  }

template<typename T> template<typename U>
sp<T>::sp(U* other) : m_ptr(other)
{
    if (other) ((T*)other)->incStrong(this);
}

template<typename T> template<typename U>
sp<T>::sp(const sp<U>& other)
: m_ptr(other.m_ptr)
  {
    if (m_ptr) m_ptr->incStrong(this);
  }

template<typename T>
sp<T>::~sp()
{
    if (m_ptr) m_ptr->decStrong(this);
}

其实只要关心第一构造函数,也就是让这个m_ptr指向我们需要用轻指针控制的变量,至于类的注销,当然调用真正需要管理的那个类的decStrong函数来处理,至于其中的友元的等号,其他操作符的重载,这里我暂时不研究,
至于使用,这里我先介绍下

class LightClass : public LightRefBase<lightClass>
{
}
void main(){
sp(LightClass) light_class = new LightClass();
{
    sp(LightClass) inner= new LightClass();
}
}

这里来了一个最简单的使用,当我们进入内部时候,我们的mCount计数为2,具体也不在验证,这里了解大概流程,sp其实就像是Java的Unti类,便于操作,这里就到这里,

后记

之前对于这个逻辑感觉好难受,现在感觉这里基本逻辑都挺正常,这里当成我的一个笔记,之后再研究强指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值