目录

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

前言

在针对一个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; //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的概念以及用法相关推荐

  1. 【C++】智能指针 Smart Pointer

    智能指针 智能指针 Smart Pointer auto_ptr 智能指针的自实现 shared_ptr weak_ptr unique_ptr 智能指针 Smart Pointer 用来改善传统指针 ...

  2. wrapper php,PHP流Streams、包装器wrapper概念与用法实例详解

    本文实例讲述了PHP流Streams.包装器wrapper概念与用法.分享给大家供大家参考,具体如下: 流Streams这个概念是在php4.3引进的,是对流式数据的抽象,用于统一数据操作,比如文件数 ...

  3. 常量指针(Pointer to const)与指针常量(Const pointer)

    常量指针(Pointer to const)与指针常量(Const pointer) 1. Concepts 很多时候对于这两个概念的困惑来自于中文字面翻译.我们无法通过字面含义直接理解判断该'常量' ...

  4. c语言使用node类型指针,C语言利用 void 类型指针实现面向对象类概念与抽象

    不使用C++时,很多C语言新手可能认为C语言缺乏了面向对象和抽象性,事实上,C语言通过某种组合方式,可以间接性的实现面对对象和抽象. 不过多态和继承这种实现,就有点小麻烦,但是依然可以实现. 核心: ...

  5. 深入理解正则表达式环视的概念与用法

    在<深入理解正则表达式高级教程-环视>中已经对环视做了简单的介绍,但是,可能还有一些读者比较迷惑,今天特意以专题的形式,深入探讨一下正则表达式的环视的概念与用法. 深入理解正则表达式环视的 ...

  6. python类装饰器详解-Python装饰器基础概念与用法详解

    本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...

  7. 关于C++中函数指针的使用(包含对typedef用法的讨论)

    关于C++中函数指针的使用(包含对typedef用法的讨论) (一)简单的函数指针的应用. //形式1:返回类型(*函数名)(参数表) char (*pFun)(int); char glFun(in ...

  8. Python中基础数据类型(List、Tuple、Dict)的概念和用法

    在Python中会有很多的数据类型,今天小千就来介绍其中的三种,列表,元组,字典和他们的概念与用法,看完你就都明白了. 一.列表 首先List是有[]包括的,每个元素用(逗号)隔开,List中可以嵌套 ...

  9. 什么是mysql的游标_MySQL游标概念是什么 MySQL游标概念与用法介绍

    本篇文章小编给大家分享一下MySQL游标概念与用法介绍,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 1.游标的概念(Cursor) 一条sql,对应N条资源,取出资源的接 ...

最新文章

  1. java executequery_关于Java怎样封装executeQuery()的问题
  2. struts2之OGNL用法
  3. 大学计算机组装与维修考试题,【校选修】计算机组装与维修 考试题
  4. 临危不乱,.Net+IIS环境经常出现的问题及排障。(转)
  5. 提高JS性能注意事项(转载)
  6. HTTP 与HTTPS的结构
  7. jhipster_jHipster入门,第1部分
  8. 数据开放平台的配置管理
  9. centos6.8自带mysql_CentOS6.8下MySQL数据库版本信息查看
  10. 什么是JavaScript垃圾回收?
  11. java开发个人项目_个人项目-WC (java实现)
  12. ipad iphone 开发的应用,加一个启动预览图片
  13. Html查看dcm,DICOM图像浏览器(.dcm图像查看器)
  14. arcgis style样式表文件转换成geoserver sld文件
  15. mysql 子链接_MySQL多表查询实例详解【链接查询、子查询等】
  16. docker的安装和部署
  17. java 设置模式_Java设计模式百例 - 调停者模式
  18. 测绘遥感地信 国内外期刊大全
  19. 第二批鸿蒙手机排名,华为郑重宣布,第二批升级鸿蒙的十款手机,荣耀30系列上榜!...
  20. opencv中mask参数

热门文章

  1. H5工程师跨页面取值的几种方法
  2. MyEclipes+html+jsp+mysql实现一个物流信息网
  3. antd Datepicker组件报错 ——date.clone is not a function或者date1.isAfter is not a function
  4. 总结CSS3新特性(选择器篇)
  5. 百度联盟广告如何理解按父容器宽度
  6. cd1101d 树形dp
  7. [NOI2010]超级钢琴 主席树
  8. 《我们应该怎样做需求分析》阅读笔记
  9. python_day7 绑定方法与非绑定方法
  10. POJ 1222 1681 1830 3185 开关灯问题 (高斯消元 异或方程组)