目录
- 前言
 - 概念
 - 用法
 - 参考
 
前言
在针对一个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可以不使用。
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; //8
  TestEP::obj* ptemp;  //定义一个指针
  ptemp = (TestEP::obj*)&mytest; //把对象mytest首地址给了这个指针ptemp,这个指针ptemp指向对象mytest首地址;
  cout << sizeof(ptemp->next) << endl; //4
  cout << sizeof(TestEP::obj) << endl; //4
  ptemp->next = nullptr;
}不过很奇怪我在我的编译环境下结果都是8.。。。
                
                










