91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android系統中輕量級指針是如何實現的

發布時間:2021-10-09 09:14:54 來源:億速云 閱讀:92 作者:iii 欄目:開發技術

這篇文章主要介紹“Android系統中輕量級指針是如何實現的”,在日常操作中,相信很多人在Android系統中輕量級指針是如何實現的問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Android系統中輕量級指針是如何實現的”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

智能指針來源

引發指針錯誤情況表現常常有如下幾個表現情況:
1.申請了內存空間,但是忘記釋放指針所指向的對象占用的內存空間。
2.使用了無效的指針。
因此在android的C++代碼部分采用了智能指針的技術。智能指針通過一種能夠自動危害對象引用計數的技術。來解決C++中指針存在的缺陷問題。
在android系統中提供了三種類型的C++智能指針,分別為:輕量級智能指針、強指針、弱指針。
下面主要通過進行分析輕量級指針的實現原理。

輕量級指針

輕量級指針就是通過利用簡單的引用計數計數類維護對象的生命周期,如果一個類的對象支持使用輕量級指針,那么它就必須要從LightRefBase類進行繼承,因為這個LightRefBase類提供了一個簡單的引用計數器。

LightRefBase類定義

下面的源碼主要依據android5.0的源碼進行分析的。LightRefBase類的定義在android系統中的\frameworks\rs\cpp\util\RefBase.h 這個文件中。
LightRefBase類也是一個模板類。模板參數T表示對象的實際類型,它必須進行對LightRefBase這個類繼承。

//模板類
template <class T>
class LightRefBase
{
public:
    //公共的內聯函數
    inline LightRefBase() : 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;
};

上面LightRefBase類定義涉及到幾個知識點:

  • 1、C++的三個訪問權限類型:public、protected、private。

public:可以被任意實體訪問。
protected:只允許子類及本類的成員函數訪問。
private:只允許本類的成員函數訪問。

  • 2、C++中的inline內聯函數

在函數第一部分如果包含有inline關鍵字的函數,那么這個函數就表示為內聯函數。內聯函數主要為了解決一些頻繁調用的小函數大量消耗棧空間(棧內存)的問題。
inline的使用是有所限制的,inline只適合涵數體內代碼簡單的涵數使用,不能包含復雜的結構控制語句例如while、switch,并且不能內聯函數本身不能是直接遞歸函數(遞歸函數:自己內部還調用自己的函數)。

  • 3、C++中的friend友元函數

C++中的友元機制允許類的非公有成員被一個類或者函數訪問,友元按類型分為三種:普通非類成員函數作為友元,類的成員函數作為友元,類作為友元。
友元函數是可以直接訪問類的私有成員的非成員函數。它是定義在類外的普通函數,它不屬于任何類,但需要在類的定義中加以聲明,聲明時只需在友元的名稱前加上關鍵字friend。

  • 4、C++中的mutable關鍵字

mutable是為了突破const的限制而設置的。被mutable修飾的變量,將永遠處于可變的狀態,即使在一個const函數中。

  • 5、C++中的template類模板

一個類模板(也稱為類屬類或類生成類)同意用戶為類定義一種模式。使得類中的某些數據成員、默寫成員函數的參數、某些成員函數的返回值,能夠取隨意類型(包含系統提前定義的和用戶自己定義的)。
類模板的應用場景:多個類有著共同操作,但是數據類型不同。

LightRefBase的實現類

輕量級LightRefBase類的實現類為wp類,它也是在\frameworks\rs\cpp\util\RefBase.h 這個文件中。wp也是一個模板類,模板參數T表示的是對象的實際類型,它必須繼承LightRefBase類。由于wp類也是強指針的實現類,因此我們只需要分析下該wp類中關于輕量級指針類的實現部分就可以了。

//模板類
template <typename T>
class wp
{
public:
    typedef typename RefBase::weakref_type weakref_type;
    //輕量級指針需要用到的構造函數
    inline wp() : m_ptr(0) { }

    wp(T* other);
    wp(const wp<T>& other);
    wp(const sp<T>& other);
    template<typename U> wp(U* other);
    template<typename U> wp(const sp<U>& other);
    template<typename U> wp(const wp<U>& other);
    //輕量級指針需要用到的虛構函數
    ~wp();

    // Assignment

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

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

    void set_object_and_refs(T* other, weakref_type* refs);

    // promotion to sp

    sp<T> promote() const;

    // Reset

    void clear();

    // Accessors

    inline  weakref_type* get_refs() const { return m_refs; }

    inline  T* unsafe_get() const { return m_ptr; }

    // Operators

    COMPARE_WEAK(==)
    COMPARE_WEAK(!=)
    COMPARE_WEAK(>)
    COMPARE_WEAK(<)
    COMPARE_WEAK(<=)
    COMPARE_WEAK(>=)

    inline bool operator == (const wp<T>& o) const {
        return (m_ptr == o.m_ptr) && (m_refs == o.m_refs);
    }
    template<typename U>
    inline bool operator == (const wp<U>& o) const {
        return m_ptr == o.m_ptr;
    }

    inline bool operator > (const wp<T>& o) const {
        return (m_ptr == o.m_ptr) ? (m_refs > o.m_refs) : (m_ptr > o.m_ptr);
    }
    template<typename U>
    inline bool operator > (const wp<U>& o) const {
        return (m_ptr == o.m_ptr) ? (m_refs > o.m_refs) : (m_ptr > o.m_ptr);
    }

    inline bool operator < (const wp<T>& o) const {
        return (m_ptr == o.m_ptr) ? (m_refs < o.m_refs) : (m_ptr < o.m_ptr);
    }
    template<typename U>
    inline bool operator < (const wp<U>& o) const {
        return (m_ptr == o.m_ptr) ? (m_refs < o.m_refs) : (m_ptr < o.m_ptr);
    }
                         inline bool operator != (const wp<T>& o) const { return m_refs != o.m_refs; }
    template<typename U> inline bool operator != (const wp<U>& o) const { return !operator == (o); }
                         inline bool operator <= (const wp<T>& o) const { return !operator > (o); }
    template<typename U> inline bool operator <= (const wp<U>& o) const { return !operator > (o); }
                         inline bool operator >= (const wp<T>& o) const { return !operator < (o); }
    template<typename U> inline bool operator >= (const wp<U>& o) const { return !operator < (o); }

private:
    template<typename Y> friend class sp;
    template<typename Y> friend class wp;
    //輕量級指針會用到的變量m_ptr
    T*              m_ptr;
    weakref_type*   m_refs;
};

到此,關于“Android系統中輕量級指針是如何實現的”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泰兴市| 滦南县| 科技| 敦煌市| 偃师市| 永德县| 阿城市| 江山市| 长沙市| 京山县| 鄂州市| 陇南市| 丰镇市| 天柱县| 新巴尔虎左旗| 永康市| 苍溪县| 于都县| 盈江县| 壶关县| 三明市| 甘洛县| 江达县| 大埔区| 玛纳斯县| 饶河县| 合川市| 台江县| 芦山县| 灵川县| 齐河县| 盐城市| 准格尔旗| 龙口市| 沙河市| 滨海县| 贞丰县| 蒲城县| 南陵县| 三穗县| 峡江县|