我有一个应用程序,其中事先知道 malloc/free 操作的顺序。我想进行预计算以最小化最大内存使用量。是否有任何资源(C++ 实现/研究论文)?
更准确地说,相同的 malloc/free 操作序列被重复多次(在每个循环结束时,所有内容都被释放)。所以我可以负担一些计算来优化内存使用。
我有一个应用程序,其中事先知道 malloc/free 操作的顺序。我想进行预计算以最小化最大内存使用量。是否有任何资源(C++ 实现/研究论文)?
更准确地说,相同的 malloc/free 操作序列被重复多次(在每个循环结束时,所有内容都被释放)。所以我可以负担一些计算来优化内存使用。
假设您想要实现的是最小化分配内存所花费的时间并可能提高缓存局部性,这听起来很简单,实际上。
只需选择内存管理器(编写一个或使用预先存在的如 Hoard)。然后,让内存管理器在程序开始时分配一个周期内使用的最大内存量。
主要问题是计算这个内存量。一个简单的解决方案是使用一个分配器来完成一个周期,该分配器除了将 malloc/free 与一个跟踪当前内存使用量和最大使用量的计数器包装在一起之外什么都不做。在您的周期结束时,该最大值是您应该在开始时分配的数量。
需要注意的一件事是,分配的内存中的碎片可能会导致需要额外的分配。这通常可以通过一个好的内存管理器来避免。在最坏的情况下,您可能必须分别跟踪为每个分配大小分配的最大内存。
作为旁注,如果您使用 C++,为什么要使用 malloc/free 而不是 new/delete?
更准确地说,相同的 malloc/free 操作序列被重复多次(在每个循环结束时,所有内容都被释放)。所以我可以负担一些计算来优化内存使用。
对于内存使用,这不是一个很难解决的问题。相同的内存将被重新分配用于相同的目的,所以如果你一遍又一遍地分配相同的内存块,它不会“浪费”内存。
既然你说,malloc
而且free
,我们是在谈论堆的旧式“C”类型使用吗?所以没有构造函数或析构函数需要担心?为什么不创建给定类型的元素数组,例如
struct X
{
...
};
旧代码:
X* px[10];
for(i = 0; i < 10; i++)
{
px[i] = malloc(sizeof(X));
...
}
而是这样做:
X* px[10];
X* xx = malloc(sizeof(X)*10);
for(i = 0; i < 10; i++)
{
px[i] = &xx[i];
}