c – 实现自己的内存池
发布时间:2020-12-16 03:10:59 所属栏目:百科 来源:网络整理
导读:我想预先分配一定量的内存,并将其用于程序的其余部分.该程序将基本上为几个字符串和结构体分配内存.如何实现?什么数据结构用于存储指针,如何使用它来给我一个特定的金额? 例如,如果我malloc 1 MB的空间,并在一个指针p,我如何从它刻出一个250 KB的一块? 这
我想预先分配一定量的内存,并将其用于程序的其余部分.该程序将基本上为几个字符串和结构体分配内存.如何实现?什么数据结构用于存储指针,如何使用它来给我一个特定的金额?
例如,如果我malloc 1 MB的空间,并在一个指针p,我如何从它刻出一个250 KB的一块? 这只是一个快速而肮脏的实现. 解决方法
如果您想要将内存返回到池中,则会变得更加复杂.但是,对于快速而不太肮脏的方法,您可能希望实现一些可以再次使用的代码
typedef struct pool { char * next; char * end; } POOL; POOL * pool_create( size_t size ) { POOL * p = (POOL*)malloc( size + sizeof(POOL) ); p->next = (char*)&p[1]; p->end = p->next + size; return p; } void pool_destroy( POOL *p ) { free(p); } size_t pool_available( POOL *p ) { return p->end - p->next; } void * pool_alloc( POOL *p,size_t size ) { if( pool_available(p) < size ) return NULL; void *mem = (void*)p->next; p->next += size; return mem; } 根据我的经验,当使用这样的池来分配很多对象时,我想预先计算需要多少内存,这样我不会浪费,但是我也不想犯错误(比如不分配enoudh).所以我把所有的分配代码放在一个循环中,并设置我的池分配函数来接受一个在空的池上执行“虚拟”分配的标志.第二次循环,我已经计算了池的大小,所以我可以创建池,并使用相同的函数调用和没有重复的代码进行真正的分配.您需要更改建议的池代码,因为如果内存未分配,则无法使用指针算术. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 电商角力,NoSQL数据库可能成为关键因素
- xml cannot be resolved or is not a field
- c – 是否有一些常见的写入和读取配置文件的方法?
- cocos2d-x3.3+vs2012开发环境搭建
- oracle mysql sqlserver 查看当前所有数据库及数据库基本操
- 常用正则表达式匹配模式(java)
- 类水平或结构级方法在swift像静态方法在Java?
- Vb.net中的Application.Exit()和FormClosing事件
- c# – IIS7,RewritePath和IIS日志文件
- c# – Xamarin表示DisplayAlert在从委托调用的函数调用时不