2017-07-07 14 views
4

ゲームをプログラミングするとき、私はすべてのゲームオブジェクトを初期化された固定サイズのstd :: vectorに格納することがありました。最近、私はゲームオブジェクトクラスの間でいくつかの継承の必要性を感じました。C++で異なる派生クラスのための効率的なコンテナ

私のクラスEnemyから派生した40のクラスがあると仮定しましょう。それらのクラスのオブジェクト/インスタンスをベクトルに格納したい場合は、ベクトルEnemy * rightとして格納するオプションしかありません。したがって、連続して割り当てられるのはポインタだけです。だから、逆参照が必要な時にはまだキャッシュミスが多いでしょうね。

派生クラスを連続して割り当てられたメモリに格納するというベストプラクティスの方法はありますか。

+1

私は彼がクラスのインスタンスについて話していると思います。それは私には明らかでした。 – TinkerTenorSoftwareGuy

+0

私はそれらのクラスのオブジェクトを意味しました。インスタンス。実行時に作成され割り当てられるもの。 – user3808217

+0

ベクトルの内部の基底クラスへのポインタを使用するか、その適合度が良い場合は、スマートポインタのようなものを使用します。 – Klaus

答えて

2

ブーストはちょうどこの目的のためにライブラリを受け入れました:poly_collection。特に、あなたが探しているのはbase_collection

内部的には、標準コンテナに近いインターフェイスを提供しながら、1つの(派生)タイプごとに1つのベクトルを使用します。

This articleは、デザインの背景と、他のソリューションとの比較を提供します(unique_ptrなど)。利点は2つあります。まず、要素ごとにポインタと動的メモリ割り当てを使用しないことで、メモリの局所性が向上し、次に同じタイプの要素をグループ化します。you help branch predictionと仮想メンバ関数の命令キャッシュ。

関連する問題