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

时间:2009-04-09 11:58:15

标签: c++ memory memory-management malloc heap

我有一个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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

我认为您的问题有一个简单的解决方案 - 您可以将外部循环移到应用程序之外并转移到shell脚本或其他应用程序中,并通过命令行将(k)(和任何其他)参数传递给基准测试app - 这样你就可以确定所有的执行都有类似的起始条件。

答案 2 :(得分:1)

使用标准C ++无法实现此功能,而无法实现自己的新版本&用自己的堆管理删除。另一种选择不是使用数组而是使用std :: vectors - 然后您可以使用自定义分配器来执行堆管理。

答案 3 :(得分:1)

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

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

压实几乎是不可能的。与Java或C#等高级语言不同,您无法更改对象的地址,因为任何指针都会失效。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

他们是几件垃圾收集代码。看看perl / python / lua / ruby​​ / mono / parrot / boehm / pike / slate / self / io等等。 另请参阅alloca()和动态数组。还可以考虑使用结构体来实现自己的析构函数,或者在函数离开范围时使用gcc属性来自由调用。