速度が重要な場合に将来の問題を解決するために、ルックアップ時間だけでなく、キャッシュミスの観点からメモリ管理について考えてください。上記の答えは私が同意します。クラスがページファイルのサイズよりも大きくない限り、ポインタは必要ありません。その場合、クラスを50回または100回分解することを検討し、それでもポインターを使用しないことをお勧めします。
速度を考えるとき、たとえばゲームエンジンでは、できるだけ多くのメモリをまとめ、必要になる前にロードし、不要なときにアンロードするようにします。メモリがフラッグされたり、キャッシュペナルティでより多くのヒットが発生したりしないようにする必要があります。特定のフレームレート、たとえば30 fpsを維持しようとする場合、実際にはこれをあまり変化させたくありません(これは、多くのキャッシュミスやメモリ移動で発生します)。std :: vectorを使用すると、誰かが提案したようにこれを行うことができ、事前に割り当て、十分に割り当てるか、必要以上に割り当てることができます。サイズ変更は後でゲームの実行時に苦痛になります。 -いいえ。
とにかく、キャッシュミスをしないことを意味する場合は、必要なものを見つけるためにすべてをトラバースする必要がある場合でも、オブジェクトの大きな配列/ベクトルを使用する方が効率的な場合があります。メモリがロードされている場合、順次保存されると、オブジェクトからオブジェクトへのジャンプが非常に高速になります。さらに、たとえば(int)idを持つものでは、vectorObject.at(id_location)を実行するのは一定時間であり、キャッシュの問題がなければ非常に高速です。
一方、たとえば、多くのキャッシュミス(データベースサイズなど)を生成する可能性のある非常に大きなベクトルへのポインタを含むstd::mapをロードした方がよい場合があります。マップのトラバースは、ベクトル(n)時間のトラバースと比較して、lg(n)時間であり、1つのキャッシュミスであっても、ポインターを介してレコード位置にジャンプする方が効率的です。ハードディスク全体をトラバースするよりも優れており、ティアジャークキャッシュを生成します。
もちろん、これは永遠の問題であり、必要なものに応じて何が正しいかを決定します。キャッシュミスを回避することを知っていると、より良い決定を下すのに役立ちます。これは、キャッシュミスについて考える必要があるのはこれが最後ではないことを確信できるからです。