背景:我正在开发一个多平台框架,将作为游戏和实用工具创建的基础。基本想法是拥有一组工作线程,每个线程都在自己的线程中执行(此外,工作线程在运行时也可以生成)。每个线程都将拥有自己的内存管理器。
我一直想创建自己的内存管理系统,并且我认为这个项目非常适合尝试一下。我认为这样的系统适合于这个框架的使用类型,因为它们通常需要在实时中进行内存分配(例如游戏和纹理编辑工具)。
问题:
没有普遍适用的解决方案(?) - 该框架将用于游戏/可视化(不是AAA级别,而是独立/玩家级别)和工具/应用程序创建。我的理解是,在游戏开发中,通常(至少对于游戏机游戏)只需在初始化时分配一大块内存,然后在内存管理器中内部使用此内存。但是这种技术是否适用于更一般的应用程序?
在游戏中,理论上可以知道场景和资源需要多少内存,但例如,照片编辑应用程序将加载各种不同大小的资源...因此,后一种情况需要更动态的内存“块大小”?这导致了下一个问题:
移动已分配的数据并保持有效指针 - 通常在堆上进行分配时,您将获取指向内存块的简单指针。在自定义内存管理器中,据我所知,类似的方法是返回指向预先分配块中某个空闲位置的指针。但是,如果预分配的块太小并且需要调整大小甚至进行碎片整理怎么办?数据将需要在内存中移动,旧指针将无效。是否有一种透明地包装这些指针的方法,但仍可像通常使用它们一样在“外部”使用C++指针?
第三方库 - 如果没有透明地使用自定义的内存管理系统来进行应用程序中的所有内存分配,那么我链接的每个第三方库仍将在内部使用“旧”的操作系统内存分配。我了解到通常情况下,库会公开一些函数来设置自定义分配函数,以供该库使用,但并不保证我将使用的每个库都具有此能力。
问题:是否可能和可行实现一个可以使用动态大小的内存块池的内存管理器?如果是,则如何进行碎片整理和内存调整,而不破坏当前正在使用的指针?最后,如何最好地实现这样一个系统与第三方库协作工作?
我也感谢任何相关的阅读材料、论文、文章等!:-)