シングルタイプの
コレクションがあり、そのタイプは実行時にのみ知られています。タイプが定義されると、決して変更されません。私は現在、このように、ベクトル内のオブジェクトへのポインタを格納している:それは連続したメモリ内のインスタンスを格納することが可能です場合、私は思ったんだけどタイプがランタイムにのみ知られている同種コンテナ
std::vector<Animal*> v;
。私の意図は、よりキャッシュフレンドリーなコードを書いて、コンテナをより速く反復することです。
私はブーストを使用することができ::各ベクトルの要素のバリアント、例えば、
std::vector<boost::variant< Cat, Dog > >
しかしsizeof(Dog)
がsizeof(Cat)
よりもはるかに大きいならば、オブジェクトはタイプCat
である場合のメモリの無駄があります。
私はまた、容器のバリアントを使用することができます:
boost::variant< std::vector<Cat>, std::vector<Dog> >
が、私はイテレータはこのケースでは、彼らはより多くのオーバーヘッドを導入する場合のだろうか分かりません。
「ポインタのベクトルが近づいていますか」ということはできるのですか?
詳細情報:オブジェクトのサイズは50〜250バイトで、コンテナの長さは10K〜1M要素です。コンテナを100万回繰り返します。
ありがとうございます。
EDIT:私は(あまりにも素敵な提案を)ここに同様の質問が見つかりました:私は答えに私のコメントをオンにするつもりです How to write cache friendly polymorphic code in C++?
「これは実行時にのみ型が分かっている単一型コレクションを持っていますか?私の年齢かもしれないが、それは –
多分、彼はバリアント型のコレクションを意味するのだろうか?あなたがオプションとトレードオフを知っているようです。あなたはあなたのためにもっと重要なものを決めるだけです。 – goji
@EdHeal:コンテナ内の値が同種の型であることを意味すると思いますが、その型はコンパイル時には分かりません。これを異種型のコンテナと比較すると、より強力ですがここでは必要ありません。 –