目錄
- 前言
- 概念
- 用法
- 參考
前言
在針對一個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之內存池改進版
感覺兩者都是參考了侯捷老師的內存管理。