多くの本で、C/C++ の配列の主な問題の 1 つは次のような引用を目にします。
配列には連続したメモリ ブロックが必要です
配列のこの機能が問題と見なされる理由がよくわかりません。コンパイラは正しいサイズを管理して配列に割り当てることができると思いますが、何が問題なのですか?
最適化はメモリ内で行われ、メモリを割り当てようとすると、必要な正しいサイズが得られない場合があります。
連続ブロックが重要な機能である理由は、オペレーティング システムで関数を呼び出すときに、通常、バッファー全体が 1 バイトずつ続くことを想定しているためです。あなた自身のコードでは、配列の実装がそれへのアクセスをカプセル化できるので、それは問題ではないかもしれません。特定の実装について知らない他の関数にそのメモリを渡すと、これはもはや当てはまりません。
もう 1 つの小さな問題として、アレイにアクセスするときのパフォーマンスが挙げられます。
言うまでもなく問題ではありませんが、配列用のスペースを確保するには、メモリ内の連続したブロックを見つける必要があることを意味します。あなたの記憶が非常に断片化されている場合、これは難しいかもしれません。そうは言っても、配列が連続的でなければならないことは、多くの場合非常に良いことです。これは、通常のメモリ アクセスが可能で、キャッシュ ミスが少なくなり、キャッシュ フレンドリーなコードが作成されることを意味するためです。
一方、他の要素へのポインターを含むリンクリストのような構造があります。これは、それらがメモリの異なる部分にある可能性があり、連続している必要がないことを意味しますが、ポインターにアクセスしようとすると、キャッシュされない可能性があるため、プログラムを遅らせるキャッシュミスがあります。
メモリの断片化の場合を考えると、配列全体のサイズ要件を満たすメモリの空きブロックを見つけることができない場合があります。
これは、何千もの可変サイズのオブジェクトが迅速に割り当ておよび割り当て解除される特定の割り当て/割り当て解除スキームで特に簡単に確認できます。これにより、空きメモリに複数の穴が残る可能性があります (使用する戦略によって異なります)。この時点で、ラージ オブジェクトの不適切なタイミングでの割り当てにより、空き領域が見つからない可能性があります。