内存池的小结

来源:互联网 发布:苹果手机排版软件 编辑:程序博客网 时间:2024/06/04 18:02

在编程中使用到了内存池,为此先学习一下内存池的相关知识吧!

1. 什么是内存池?

所谓内存池就是预先分配好的一定数量的大小相等的内存块,当需要使用的时候可以直接从中使用,而不必再申请。

2. 为什么要使用内存池?有什么优点?

使用new 或 malloc进行内存分配会使用很多时间,特别是高频率的小内存申请释放。

优点: 极少的堆碎片整理;  更快的分配速度; 

3. 编程实现:

两个重要结构体:

 编程思想:在编程中创建了两个内存池,一个为读内存池,一个为写内存池,分别有read_head 和write_head指向,在初始化中创建了两个块,一个用于写入数据,一个用于读取数据,初始化中,先确定块的大小,然后使块的头结构体中的写指针和读指针指向第一个存储单元的位置,并更改剩余空间的大小,以及已经使用单元的个数。           当写入数据时,将数据拷贝到第一个存储单元的后面(并修改单元结构体中数据的长度),将write指针指向数据的后面作为单元结构体(第二个单元),第一个存储单元的next指向该单元,。。。。。。。。。。。。即单元结构体中存储存储到目前位置空闲空间的大小,和当前单元存储数据的大小(单元大小不同,即数据大小),以及指向下一个单元的指针,head结构体中write_sign指针总是指向下一个可写的单元。          当消费者读取数据时,需要先进行交换,即将write块变为read块,将read块变为 write块,(只有write块中有数据,且写已经完成,才进行交换)。                   读取数据:read_sign指针指向存有数据的单元结构体,每次读取,即根据单元结构体中数据长度,将数据复制到指定buf中,然后修改read指向next

初始化工作

初始化中的工作主要有: 指定内存块的大小,并分配内出块,然后初始化head结构体中的指针。





写操作:

找到可写的位置,跳过需要写入数据的长度,找到head指针下次指向的unit单元,修改新unit单元中剩余空间大小,修改旧unit中保存的数据的大小,改变指针的指向,head指针的write_sign指向新的unit ,旧 unit的next 指向新unit,使用memcpy将数据拷贝到旧unit单元的后面。


交换读写块:

在已经完成读和写,且写内存块中已经写入完数据时,可以进行交换,即调换read_head write_head即可。


读内出块:

读内存块用到head中的read_sign指针,即从read-sign后面拷贝出unit指定的数据长度的数据即可,然后使read_sign指向 unit结构体中的next即可。



0 0
原创粉丝点击