主题:【请教】自建memory pool,请问如何管理内存碎片 -- 东方射日

共:💬6 🌺2 新:
全看分页树展 · 主题 跟帖
家园 是有问题,多谢指出,现有另一个思路

首先,这个问题来源是对XBOX/PS3编程的,相对内存比较紧张,而且对速度要求比较高,申请内存池的目的主要是减少对系统内存分配的请求,而内存池中的fragment随运行时间的增加,也是绝对不可忽视的。

经有人建议,采用老MAC OS的内存管理机制,使用双指针,不直接将内存地址返回给程序,而是维护一个地址列表,然后将地址列表中元素的地址返回给程序,这样OS可以在空余期间收集碎片,而程序需要dereference两次来取得实际地址。

我们在memory pool中建立一个Memory_pointer_table存储在pool中的地址

new返回MPTBL中的地址

defragment整理pool和MPTBL中指针值。应用程序allocate得到的指针不变。dereference后指向的内存内容不变。

代价是*是一定要重载的,如果要求支持数组的话,new[]和delete[]和数组下标[]也是要重载。

实现起来有一定困难,特别是类中的动态内存要用到的成员指针.*无法重载。限制了类中动态内存的应用。

不过起码是可以实现的方案。毕竟自己写个memory pool不能指望100%达到系统的功能

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河