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

あなたの問題には簡単な解決策があると思います-外側のループをアプリケーションの外側に移動して、シェルスクリプトまたは別のアプリケーションに移動し、(k) (およびその他の) パラメーターをコマンドラインからベンチマークアプリに渡すことができます-これすべての実行が同様の開始条件を持っていることを確認する方法.

于 2009-04-09T12:07:30.043 に答える
1

独自のヒープ管理を使用して独自のバージョンのnew&deleteを実装する以外に、標準C++を使用してこれを行う方法はありません。別の方法は、配列を使用せず、代わりにstd :: vectorを使用することです。その後、カスタムアロケータを使用してヒープ管理を行うことができます。

于 2009-04-09T12:01:51.070 に答える
1

どう言う意味ですか?Cにはガベージコレクションはなく、圧縮もありません。

「ヒープの状態をリセット」するには、malloc()を呼び出すたびにfree()を呼び出す必要があります。そして、私があなたのコードを理解しているように、あなたはすでにそれをしています。

圧縮はほとんど不可能です。JavaやC#などの高級言語とは異なり、オブジェクトへのポインタは無効になるため、オブジェクトのアドレスを変更することはできません。

于 2009-04-09T12:02:59.337 に答える
0

それらは、ガベージコレクションコードの一部です。perl / python / lua / ruby​​ / mono / parrot / boehm / pike / slate / self / ioなどを見てください。alloca()と動的配列も見てください。また、構造体を使用して独自のデストラクタを実装するか、関数がスコープを離れるときにgcc属性を使用してfreeを呼び出すことを検討してください。

于 2009-05-06T08:00:37.340 に答える
0

自動的な方法はありません。ヒープ上にあるものを手動で削除して、(1)の状態に戻す必要があります。

于 2009-04-09T12:02:20.180 に答える