This topic has been archived. It cannot be replied.
-
工作学习 / 专业技术讨论 / 请教高手:有自建memory pool的,请问如何管理内存碎片
-xxjjs(东方射日);
2007-2-1
{781}
(#3471668@0)
-
google "placement new"
-dusk(~小桥流水~);
2007-2-1
(#3471684@0)
-
不用google,这个语法我熟悉但是还是没有解决我的问题
我建立了一个1M的memory pool,随后建立了20个50k的对象。
运行中,我delete了其中4个长得最难看或是成绩最差的(我这样说是指在我delete前,即使我先排序,再进行placemen new也无法保证这四个对象连续,因为删除的标准未定)对象,还是无法allocate 100k内存给另一个大对象。
或者我仅仅熟悉语法,对placement new的应用还有没有理解的地方?请帮忙给个解释?多谢
-xxjjs(东方射日);
2007-2-1
{369}
(#3471711@0)
-
苹果OS以前使用双指针,不直接将内存地址返回给程序,而是维护一个地址列表,然后将地址列表中元素的地址返回给程序,这样OS可以在空余期间收集碎片,而程序需要dereference两次来取得实际地址。OS同时提供API给程序来临时锁定某块内存。
-dpff(dpff);
2007-2-1
(#3471764@0)
-
这是一个好方法,代价是要重载取址和指针运算符 &和×
-xxjjs(东方射日);
2007-2-1
(#3471776@0)
-
那要看你的内存管理器或者wrapper class的实现了,反正理论上是可行的,把锁做好了也不会出问题。反正记得当初学C不久,指针还没搞熟,看到苹果OS程序中到处是**心理发虚...
-dpff(dpff);
2007-2-1
(#3471785@0)
-
Agree
-kaia(清渣工);
2007-2-2
(#3473576@0)
-
多谢,我想这个思路可以实现在memory pool中建立一个Memory_virtual_table存储在pool中的地址
new返回MVTBL中的地址
defragment整理pool和VMTBL中指针值。应用程序调用指针指向的内存内容不变。
代价是&和*是一定要重载的,如果仔细研究,数组下标[]也是要重载
实现起来有一定困难,不过起码是可以实现的方案。毕竟自己写个memory pool不能指望100%达到系统的功能
-xxjjs(东方射日);
2007-2-1
{315}
(#3471799@0)