我有一个应用程序,其中malloc/free操作的顺序是预先知道的。我想做一个预计算来最小化最大内存使用量。有没有相关的资源(c++实现/研究论文)?
更准确地说,相同的malloc/free操作序列被重复多次(在每个周期结束时,所有操作都被释放)。因此,我可以提供一些计算来优化内存使用。
发布于 2013-05-05 15:32:47
假设您想要实现的目标是最大限度地减少分配内存所花费的时间,并尽可能提高缓存的局部性,实际上这听起来非常简单。
只需选择内存管理器(编写一个或使用一个预先存在的,如Hoard)。然后,让内存管理器在程序开始时分配一个周期内使用的最大内存量。
主要的问题是计算这个内存量。一个简单的解决方案是使用一个分配器经历一个周期,这个分配器除了包装malloc/free和一个跟踪当前内存使用情况和最大使用情况的计数器之外,什么也不做。在你的周期结束时,这个最大值就是你应该在开始时分配多少。
要注意的一件事是,分配的内存中的碎片可能会导致需要额外的分配。这通常可以通过一个好的内存管理器来避免。在最坏的情况下,您可能需要单独跟踪为每个分配大小分配的最大内存。
顺便说一句,如果你在使用C++,为什么你要使用malloc/free而不是new/delete呢?
发布于 2013-05-05 15:39:32
更准确地说,相同的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];
}https://stackoverflow.com/questions/16382074
复制相似问题