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