だから私はクラスsomeBase{}を持つライブラリを作成しています。これは、多くのクラスのダウンストリームユーザーによって導出されます。
class someBase {
public:
virtual void foo()=0;
};
私も持っているのは、someBaseへのポインターのベクトルであり、これを実行しています:-
vector <someBase*> children;
// downstream user code populates children with some objects over here
for (i=0; i<children.size(); i++)
children[i]->foo();
現在、プロファイリングは、仮想呼び出しでのブランチの予測ミスが、私のコードの(いくつかの)ボトルネックの1つであることを示唆しています。私が探しているのは、どういうわけかオブジェクトのRTTIにアクセスし、それを使用してクラスタイプに従って子のベクトルを並べ替え、命令キャッシュの局所性と分岐予測の両方を改善することです。
これを行う方法に関する提案/解決策はありますか?
覚えておくべき主な課題は次のとおりです:-
1.)someBaseから派生するクラスがどれか、またはいくつになるかはわかりません。仮に、ダウンストリームユーザーが編集して独自のクラスタイプを追加し、それを並べ替えることができる共通ファイルのどこかにグローバル列挙型を含めることができます(基本的には独自のRTTIを実装します)。しかし、それは醜い解決策です。
2.)PiotrNyczは、以下の回答でtype_infoを使用することを提案しています。ただし、そのために定義されているのは!=と==のみです。type_infoで厳密な弱順序を導出する方法に関するアイデアはありますか?
3.)分岐予測と命令キャッシュの局所性を改善することを本当に望んでいるので、別の解決策があれば、それも歓迎されます。