代码之家  ›  专栏  ›  技术社区  ›  Manuel

使用malloc()强制垃圾收集/压缩

  •  4
  • Manuel  · 技术社区  · 15 年前

    我有一个C++程序,在不同长度的输入数组上对各种算法进行基准测试。看起来差不多是这样的:

    # (1)
    for k in range(4..20):
      # (2)
      input = generate 2**k random points
      for variant in variants:
        benchmark the following call
        run variant on input array
      # (3)
    

    是否可以将(2)处的整个堆管理重置为(1)处的状态?在程序期间分配给堆的所有内存都保证在(3)释放。

    我在Linux上使用G++4.3。

    编辑:我知道C/C++中没有真正的垃圾收集。我想强制内存分配连接相邻的空内存块,该内存块位于(2)的空闲列表中。

    6 回复  |  直到 15 年前
        1
  •  6
  •   jpalecek    15 年前

    如果希望测试运行以相同的堆状态开始,可以在fork()创建的自己的进程中运行它们。

        2
  •  3
  •   RnR    15 年前

    我认为有一个简单的解决方案可以解决你的问题——你可以将外部循环移出你的应用程序,进入一个shell脚本或另一个应用程序,然后通过命令行将(k)(和任何其他)参数传递给基准应用程序——这样你就可以确保所有的执行都有类似的启动条件。

        3
  •  1
  •   anon    15 年前

    没有办法使用标准C++来实现自己的堆管理的新版本和删除版本。另一种选择不是使用数组,而是使用std::vectors——然后可以使用自定义分配器进行堆管理。

        4
  •  1
  •   Stack Overflow is garbage    15 年前

    你什么意思?C中没有垃圾收集,当然也没有压缩。

    要“重置堆的状态”,必须对每个malloc()调用调用free()。正如我理解你的代码,你已经做到了。

    压缩几乎是不可能的。不同于高级语言(如Java或C语言),不能更改对象的地址,因为任何指向它的指针都会失效。

        5
  •  0
  •   Brian R. Bondy    15 年前

    没有自动的方法,您必须手动删除堆中的任何内容才能返回到(1)的状态。

        6
  •  0
  •   nelix    15 年前

    它们是一些垃圾收集代码。看看perl/python/lua/ruby/mono/parrot/boehm/pike/slate/self/io等。 还可以查看alloca()和动态数组。还可以考虑使用结构来实现自己的析构函数,或者在函数离开作用域时使用gcc属性来自由调用。