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

本文介绍了嵌入式指针在内存管理池中的工作原理和用法,它利用对象内存的前4个字节作为链表指针。当内存被分配或归还时,next指针用于维护空闲内存块的链表。在C++中,通过union可以实现使用期成员变量与指针的复用。文章提供了示例代码展示如何在类结构中实现这一概念,并引用了侯捷老师的内存管理思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

针对一个class写出它的内存管理池以及总结出allocator类(三个版本)中内存管理池的第二个版本中涉及到了一个非常重要的概念:嵌入式指针。同时嵌入式指针也在G2.9版本的alloc中出现。现在整理一下网上的一些用法和概念

概念

嵌入式指针工作原理:借用A对象所占用的内存空间中的前4个字节,这4个字节用来 链住这些空闲的内存块;
但是,一旦某一块被分配出去,那么这个块的 前4个字节 就不再需要,此时这4个字节可以被正常使用;
从工作原理中可以看出嵌入式指针使用前提:类A对象的sizeof必须不小于4字节。

用法

什么时候会用到next指针呢?

  1. 第一次分配对象,建立整个freeStore的链表的时候,初始化各个实例的next指针
  2. 每次给申请者一个实例时,要修改freeStore = freeStore->next
  3. 每次归还一个实例时,链表插入操作要用到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; //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.。。。

参考

内存分配(2)–embedded pointer
C++11/14之内存池改进版
感觉两者都是参考了侯捷老师的内存管理。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾牙慧者

欢迎请作者喝奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值