背景:我开发将被用来作为基地都游戏和UTIL /工具创造各种各样的多平台框架。基本的想法是拥有一群工人,每个人都在自己的线程中执行。 (此外,工作人员也可以在运行时产生。)每个线程都有它自己的内存管理器。在具有动态大小内存池的多线程C/C++中实现内存管理器?
我很早就想过创建自己的内存管理系统,我觉得这个项目会很完美,最后再试试。由于这种框架的使用类型,我发现这样的系统适配通常需要实时存储分配(游戏和纹理编辑工具)。
问题:
没有普遍适用的解决方案 - 该框架将同时用于游戏/可视化(不是AAA,但独立/播放)和工具/应用程序创建(?)。我的理解是,对于游戏开发来说,通常(至少对于游戏机游戏)在初始化时只分配一大块内存,然后在内存管理器的内部使用该内存。但是这种技术是否适用于更普遍的应用?
在一个游戏中,你理论上可以知道你的场景和资源需要多少内存,但是例如,照片编辑应用程序将加载所有不同大小的资源......所以在后一种情况下,更动态的内存“块大小“将需要?这使我下一个问题:
移动已分配的数据,并保持有效的指针 - 在堆中分配时,通常情况下,你将获得一个简单的指针内存块。在一个自定义内存管理器中,就我所知,类似的方法是将指针返回到预分配块中的空闲位置。但是,如果预先分配的块太小,需要调整大小或进行碎片整理,会发生什么情况?数据将需要在内存中移动,旧指针将无效。有没有办法以某种方式透明地包装这些指针,但仍然像通常的C++指针一样,将它们用作内存管理的“外部”?
第三方库 - 如果没有办法透明地使用自定义的内存管理系统应用程序中所有的内存分配,每一个第三方库,我与链接,仍然会使用“旧”操作系统内存分配。我了解到,图书馆通常会公开函数来设置库将使用的自定义分配函数,但不保证每个我将使用的函数库都具有这种能力。
问题:它是可能和可行的实现能够使用动态内存大小的组块池内存管理器?如果是这样,那么碎片整理和内存调整大小如何工作,而不会破坏当前正在使用的指针?最后,这个系统如何最好地与第三方库一起工作?
我也很感谢任何相关的阅读材料,论文,文章和whatnot! :-)
我会添加一些资源作为评论我发现我对未来的读者有兴趣(尽量不要混淆实际问题): http://www.swedishcoding.com/2008/ 08/31 /内存不足/和Jason Gregory撰写的“Game Engine Architecture”一书 - 第5.2节“内存管理”。 – andsve
如果你不需要付钱,也不要重新发明轮子。 – AJMansfield
...或者如果它很有趣。 – manasij7479