我有一个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)的空闲列表中的相邻空内存块。
答案 0 :(得分:6)
如果希望测试运行以相同的堆状态启动,则可以在fork()创建的自己的进程中运行它们。
答案 1 :(得分:3)
我认为您的问题有一个简单的解决方案 - 您可以将外部循环移到应用程序之外并转移到shell脚本或其他应用程序中,并通过命令行将(k)(和任何其他)参数传递给基准测试app - 这样你就可以确定所有的执行都有类似的起始条件。
答案 2 :(得分:1)
使用标准C ++无法实现此功能,而无法实现自己的新版本&用自己的堆管理删除。另一种选择不是使用数组而是使用std :: vectors - 然后您可以使用自定义分配器来执行堆管理。
答案 3 :(得分:1)
要“重置堆的状态”,必须为每个malloc()调用调用free()。正如我理解你的代码,你已经这样做了。
压实几乎是不可能的。与Java或C#等高级语言不同,您无法更改对象的地址,因为任何指针都会失效。
答案 4 :(得分:0)
没有自动方式,您必须手动删除堆上的任何内容才能返回到状态(1)。
答案 5 :(得分:0)
他们是几件垃圾收集代码。看看perl / python / lua / ruby / mono / parrot / boehm / pike / slate / self / io等等。 另请参阅alloca()和动态数组。还可以考虑使用结构体来实现自己的析构函数,或者在函数离开范围时使用gcc属性来自由调用。