日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

嵌入式指针embedded pointer的概念以及用法

發布時間:2023/12/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌入式指针embedded pointer的概念以及用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

    • 前言
    • 概念
    • 用法
    • 參考

前言

在針對一個class寫出它的內存管理池以及總結出allocator類(三個版本)中內存管理池的第二個版本中涉及到了一個非常重要的概念:嵌入式指針。同時嵌入式指針也在G2.9版本的alloc中出現。現在整理一下網上的一些用法和概念

概念

嵌入式指針工作原理:借用A對象所占用的內存空間中的前4個字節,這4個字節用來 鏈住這些空閑的內存塊;
但是,一旦某一塊被分配出去,那么這個塊的 前4個字節 就不再需要,此時這4個字節可以被正常使用;
從工作原理中可以看出嵌入式指針使用前提:類A對象的sizeof必須不小于4字節。

用法

什么時候會用到next指針呢?

  • 第一次分配對象,建立整個freeStore的鏈表的時候,初始化各個實例的next指針
  • 每次給申請者一個實例時,要修改freeStore = freeStore->next
  • 每次歸還一個實例時,鏈表插入操作要用到next.
  • next指針的使用都是在申請和歸還的時候,也就是說申請者在使用這塊內存的時候從來都不需要next.
    既然next指針所占的4個字節不會被同時使用,那我們可以通過union,讓使用時和申請/歸還重用同一塊內存。
    下面是具體代碼:

    class CMyObject { private:struct CMyObjectRep{int _data1;char _data2;}; private://注意,這里是個匿名的union,我們把使用期的成員變量都放在一個結構里面union{CMyObjectRep rep; // 使用期會用到的成員變量CMyObject* next; // 分配,歸還時使用的,服務于空閑鏈表操作}; public://其他都和簡單的空閑鏈表的實現一模一樣 }

    再看一下另外一個參考代碼:
    struct里放了一個指針,它的大小為4個字節。這個指針的值,存著下一個內存的地址。由于這里只需要指針,所以union可以不使用。

    #include<iostream> using namespace std; class TestEP { public:int m_i;int m_j;public:struct obj //結構 //定義一個類型,不放在外部,污染全局變量{//成員,是個指針struct obj* next; //這個next就是個嵌入式指針//自己是一個obj結構對象,那么把自己這個對象的next指針指向 另外一個obj結構對象,最終,把多個自己這種類型的對象通過鏈串起來;}; };int main() {TestEP mytest;cout << sizeof(mytest) << endl; //8TestEP::obj* ptemp; //定義一個指針ptemp = (TestEP::obj*)&mytest; //把對象mytest首地址給了這個指針ptemp,這個指針ptemp指向對象mytest首地址;cout << sizeof(ptemp->next) << endl; //4cout << sizeof(TestEP::obj) << endl; //4ptemp->next = nullptr;}

    不過很奇怪我在我的編譯環境下結果都是8.。。。

    參考

    內存分配(2)–embedded pointer
    C++11/14之內存池改進版
    感覺兩者都是參考了侯捷老師的內存管理。

    總結

    以上是生活随笔為你收集整理的嵌入式指针embedded pointer的概念以及用法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。