4

我有一个 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) 处加入它在其空闲列表中的相邻空内存块。

4

6 回答 6

6

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

于 2009-04-09T12:09:13.690 回答
3

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

于 2009-04-09T12:07:30.043 回答
1

除了使用自己的堆管理实现自己的 new 和 delete 版本之外,没有办法使用标准 C++ 来做到这一点。另一种方法是不使用数组,而是使用 std::vectors - 然后您可以使用自定义分配器来进行堆管理。

于 2009-04-09T12:01:51.070 回答
1

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

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

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

于 2009-04-09T12:02:59.337 回答
0

没有自动的方法,您必须手动删除堆上的所有内容才能恢复到 (1) 的状态。

于 2009-04-09T12:02:20.180 回答
0

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

于 2009-05-06T08:00:37.340 回答