C 标准库如何实现共享内存介绍
创始人
2024-06-21 15:51:47
0

初次使用C++标准库实现共享内存的管理时,Vector每次分配内存个数不固定,回收也不固定,这样的话,程序还需要继续完善,下面就随本文的讲述来让大家进一步的了解C++中的C++标准库。

内存池管理程序源码如下:

  1. #ifndef MY_ALLOCATOR_H_   
  2. #define MY_ALLOCATOR_H_   
  3. #include "stdafx.h"   
  4. #include    
  5. #include    
  6. namespace happyever    
  7. {   
  8.   enum { NODENUMS = 2 };   
  9.   union _Obj    
  10.   {   
  11.     union _Obj* M_free_list_link;   
  12.     char M_client_data[1];       
  13.   } ;   
  14.   typedef union _Obj Obj;   
  15.   struct _Cookie   
  16.   {   
  17.     int iShmKey;        /* 共享内存键值 */   
  18.     int iShmID;         /* iShmKey对应的shmid */   
  19.     int iSemKey;        /* 锁信号键值 */   
  20.     int iSemID;         /* 锁信号标识 */   
  21.     int iTotalsize;    /* 容器总容量 */   
  22.     void* pStartall;   /* 共享内存自身地址 */   
  23.     char* pStartfree;  /* 自由空间的开始地址*/   
  24.     char* pEndfree;    /* 自由空间的结束地址*/   
  25.     int iUseNum[NODENUMS];   
  26.     /*用来存放free_list中节点的size*/   
  27.     short sFreelistIndex[NODENUMS];   
  28.     /*存放分配内存节点的链表*/   
  29.     Obj* uFreelist[NODENUMS];   
  30.   };   
  31.   typedef struct _Cookie Cookie;   
  32.   //Obj;   
  33.   //Cookie;   
  34.   static Cookie *pHead = NULL;   
  35.   template  T>   
  36.   class MyAlloc    
  37.   {   
  38.   private:   
  39.     static const int ALIGN = sizeof(Obj);   
  40.     int round_up(int bytes);   
  41.     int freelist_index(int bytes);   
  42.     int freelist_getindex(int bytes);   
  43.     char* chunk_alloc(int size, int *nobjs);   
  44.     void* refill(int num,int n);   
  45.   public:   
  46.     // type definitions   
  47.     typedef T        value_type;   
  48.     typedef T*       pointer;   
  49.     typedef const T* const_pointer;   
  50.     typedef T&       reference;   
  51.     typedef const T& const_reference;   
  52.     typedef std::size_t    size_type;   
  53.     typedef std::ptrdiff_t difference_type;   
  54.     template  U>   
  55.     struct rebind    
  56.     {   
  57.       typedef MyAlloc other;   
  58.     };  

以上程序只要稍微修改,就可以实现共享内存的管理,可以方便的使用C++标准库提供的容器。加上信号量的锁机制。以上为了学习而改写的SGI的stl二级分配算法实现的。以上代码存在一定的局限性。

我另外完整实现了共享内存管理的STL标准的alloctor程序,使用posix信号量加锁。目前应用在aix的xlC编译环境下。因为源码涉及公司的商业秘密,所以不能公开。但基本上以上源码已经体现了自己管理内存的完整思路,供这方面需求的朋友一起学习研究用。

【编辑推荐】

  1. 简介学习C++总结之谈
  2. 对C++库函数进行学习探索总结笔记
  3. C++类库设计的基本构思与方法
  4. C++语言真的还有市场价值?
  5. C++类库设计的基本构思与方法

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...