【问题标题】:Memory allocation with a pattern known in advance使用预先知道的模式分配内存
【发布时间】:2013-05-05 06:41:57
【问题描述】:

我有一个应用程序,其中 malloc/free 操作的顺序是预先知道的。我想进行预计算以最小化最大内存使用量。是否有任何资源(C++ 实现/研究论文)?

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

【问题讨论】:

  • 我认为您还需要指定正在使用的编程语言。
  • 我不知道这方面的论文,但是`同样的 malloc/free 操作序列被重复了很多次(在每个循环结束时所有的东西都被释放了)`听起来你可以创建私有堆特定大小,在它们上分配,然后释放整个堆。您使用哪个平台?
  • 理想情况下,我希望独立于平台(例如 Windows 和 unix)。出于好奇,这个解决方案可以在哪些平台上实现?您能否指出允许此功能的私有堆的实现?
  • 在 Windows 中,您拥有HeapCreate/HeapFree,它可以让您一次释放整个堆。

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


【解决方案1】:

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

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

主要问题是计算这个内存量。一个简单的解决方案是使用一个分配器完成一个周期,该分配器除了将 malloc/free 与一个跟踪当前内存使用量和最大使用量的计数器包装在一起之外什么都不做。在您的周期结束时,该最大值是您应该在开始时分配的数量。

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

顺便说一句,如果您使用 C++,为什么要使用 malloc/free 而不是 new/delete?

【讨论】:

    【解决方案2】:

    更准确地说,同样的 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];
       }
    

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 1970-01-01
      • 2020-05-20
      • 2016-05-31
      • 1970-01-01
      • 2013-10-30
      • 2013-05-18
      • 2015-12-05
      • 1970-01-01
      相关资源
      最近更新 更多