1

我正在做一些图形编程,我正在使用顶点池。我希望能够从池中分配一个范围并将其用于绘图。

我需要的解决方案与 C 分配器的不同之处在于我从不调用 malloc。相反,我预先分配了数组,然后需要一个对象来包装它并跟踪可用空间并从我传入的分配中分配一个范围(一对开始/结束指针)。

非常感谢。

4

3 回答 3

2

一般来说:您正在寻找一个内存管理器,它使用(参见维基百科)内存池(如TokenMacGuy 回答的boost::pool )。它们有多种口味。重要注意事项:

  • 块大小(固定或可变;不同块大小的数量;是否可以(统计)预测块大小的使用?
  • 效率(一些管理器有 2^n 块大小,即用于网络堆栈,在那里他们搜索最适合的块;非常好的性能和不以浪费内存为代价的碎片)
  • 管理开销(我假设您将拥有许多非常小的块;因此内存管理器维护的整数和指针的数量对效率很重要)

以 boost::pool 为例,我认为简单的隔离存储值得一看。它将允许您配置具有许多不同块大小的内存池,以搜索最佳匹配。

于 2009-08-07T07:00:10.237 回答
1

boost::pool很好地为你做这件事!

于 2009-08-07T06:40:26.033 回答
0

相反,我预先分配了数组,然后需要一个对象来包装它并跟踪可用空间并从我传入的分配中分配一个范围(一对开始/结束指针)。

基本上就是 malloc() 在内部所做的(如果 malloc() 已满,它可以增加这个“预分配数组”的大小)。所以是的,有一个算法。事实上,有很多,维基百科给出了一个基本的概述。不同的策略可以在不同的情况下更好地发挥作用。(例如,如果所有块的大小相似,或者如果有一些分配和释放模式)

如果您有许多相同大小的对象,请查看 obstacks。

您可能不想自己编写代码,这不是一件容易的事,而且错误可能会很痛苦。

于 2009-08-15T12:59:49.447 回答