2012-02-10 11 views
2

行列を表すすべての動的多次元配列を割り当て、割り当てを解除します。でも、エラーチェックと手動メモリ管理を犠牲にして配列対ベクトル:: Boost ::配列

優先順位、:

  1. スピード
  2. 小さなメモリフットプリント

は、これらの優先順位与えられた、最良の選択Cスタイルの配列です。 ?これはよく聞かれる質問ですが、私は自分の状況に対して決定的な答えを見つけることができませんでした。

答えて

2

特定の「フレーム」(それが何であれ)に使用される一連のアレイに必要な最大メモリ量を特定でき、一度に1つのフレームのみを扱う場合(言い換えると、単一の配列セットで作業を行い、別の配列セットで別の作業を実行する前にすべての配列をダンプします)、次に配列を割り当てて可能な限り大きなワークセットに適したサイズの静的メモリーのブロック。

次に、配列の割り当ては、ブロックの先頭から配列のメモリを切り出し、その割り当てをたどってブロックポインタを調整して、次の配列割り当ての準備を整える単純なプールアロケータにすることができます。その配列のセットを使って作業を終えたら、ブロックプールを静的メモリプールの先頭にリセットするだけで、すべて「プールをクリーニングする」ことができます。

もちろん、あなたの仕事をどのようにしなければならないかという詳細をあまり与えていないので、このテクニックはまったく適合しないかもしれません(それはおそらくまだ決定的な答えを見つけていません答えは実行している作業の特定の特性に依存します)。

0

あなたはあなたに良い答えを与えるためにあなたの問題に関する情報をあまりにも少なくしています。あなたのプログラムは、1つのプラットフォーム上でのみ動作するか、それともプラットフォームに依存しないのでしょうか?あなたのプロジェクトには時間効率が重要ですか?その場合は、おそらく 'new'と 'delete'を使用するのが遅すぎるかもしれませんし、プラットフォーム固有のアロケータやサードパーティのアロケータに頼る必要があります。次に、動的に割り当てられた配列とstd :: vectorとの間の選択は違いをもたらすべきではありません。 スタックに配列を割り当てたいのですか?しかし、スタックに作成できる配列のサイズには限界があります。行列のサイズは?

0

std :: vectorは通常、C配列と同じくらい良好ですが、あなたが究極の素骨のスピードを望んでいて、何をしているのか知っていれば、自分でC配列を管理することはできません。

考慮すべきトレードオフがあります。 - カスタムコードのデバッグにどれだけの時間を費やしていますか? - あなたが書きたいカスタムコードはどれくらいですか?

また、配列/ベクターライブラリは速度とメモリ消費のために非常によくテストされ、最適化されているため、決定する前にさまざまなコンパイラ設定を使用してベンチマークすることをお勧めします。

0

行列を表現したい場合は、1次元配列はすでに多次元配列より優れています。配列は、あなたの処分で既に持っている最も単純な構造であるので、より適切です。

ベクトルの目的は動的配列を実装することです。マトリックスは固定サイズなので、この機能は必要ありません。