使用事先已知的模式分配内存

时间:2013-05-05 06:41:57

标签: c++ memory-management optimization pattern-matching

我有一个应用程序,其中事先知道malloc / free操作的顺序。我想做一个预先计算,以最大限度地减少最大内存使用量。是否有任何资源(c ++实施/研究论文)?

更准确地说,相同的malloc / free操作序列重复多次(在每个循环结束时,所有内容都被释放)。所以我可以负担一些计算来优化内存使用。

2 个答案:

答案 0 :(得分:0)

假设你想要实现的是最小化分配内存所花费的时间并可能改善缓存局部性,实际上这听起来很简单。

选择内存管理器(写一个或使用预先存在的,如Hoard)。然后,让内存管理器分配在程序开始的一个周期内使用的最大内存量。

主要问题是计算这个内存量。一个简单的解决方案是使用一个分配器完成一个循环,除了将malloc / free与计数器一起包装,该计数器跟踪当前内存使用情况和最大使用量。在你的周期结束时,最大值是你应该在开始时分配多少。

需要注意的一件事是,分配的内存中的碎片可能导致需要额外的分配。一个好的内存管理器通常可以避免这种情况。在最坏的情况下,您可能必须分别跟踪为每个分配大小分配的最大内存。

作为旁注,如果您使用的是C ++,为什么使用malloc / free而不是new / delete?

答案 1 :(得分:0)

  

更准确地说,相同的malloc / free操作序列是   重复多次(在每个循环结束时,一切都被释放)。所以   我可以负担一些计算来优化内存使用。

对于内存使用,这不是一个难以解决的问题。同样的内存将被重新分配用于相同的目的,因此如果你一遍又一遍地分配相同的内存块,它不会“浪费”内存。

既然你说mallocfree,我们是在谈论旧式“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];
   }