目录
- 前言
- 概念
- 用法
- 参考
前言
在针对一个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之内存池改进版
感觉两者都是参考了侯捷老师的内存管理。