0

コンテナを実装したい。データは、動的に割り当てられた配列に格納されます。メモリの再割り当てについてアドバイスが必要です。

基本的に、配列がいっぱいになったときに配列をどれだけ大きくするかについての式が必要です。配列が大きいほど、コピーに時間がかかるため、定数値は最適ではないと思います。

たとえば、1000000 個の double を格納できる配列がいっぱいになった場合、1000005 個の double を再割り当てするのはばかげています。1001000に行く方が良い考えです。それどころか、5 つの double の配列があり、それがいっぱいになった場合、それを 1005 ユニットに拡大するのも同様にばかげています。たぶん、毎回10%(または20 + 10%のように、小さな配列でも問題ないように)拡大することをお勧めします。これに関するアドバイスはありますか?

4

1 に答える 1

1

std::vector を再利用することから始めます。すでにうまく機能しているものを再実装しないでください。

データのサイズがある程度わかっている場合は、reserve() 関数を使用して、必要以上に頻繁に割り当てないようにします。データ量が正確にわからない場合は、20% または 40% の余分なスペースを自由に確保してください。

データのサイズについて何も知らない場合、std::vector は何も知らなくてもパフォーマンスが向上するように最適化されます。データのサイズについて何も知らない場合、10001 個のエントリがあり、ベクトルが 9999 個のエントリを持ち、あまり積極的でないアルゴリズムが選択した 4 つまたは 5 つの無駄なコピーを回避するのと同じように、無駄に多くのスペースを割り当てる可能性があります。Std::vector の実装は、ユーザーがサイジングに関する情報を持っていない場合に最適な動作を保証するために、何百もの工数をかけて微調整されています。

私がそれから逸脱し始めるのは、ギガバイトのデータセットに取り掛かり始めたときだけです。次に、大きすぎてメモリに収まらないものを割り当てないようにすることをお勧めします。

于 2013-09-06T20:07:02.870 に答える