2010-11-18 4 views
0

質問の助けを借りてFast and flexible iterator for abstract class抽象クラスGridData用の抽象的なGridIteratorを作成しました。これで、GridIteratorの具体的なサブクラスを使用して、GridDataの具体的なサブクラスを反復処理することができました。オブジェクト指向のIteratorクラスを高速化するにはどうすればいいですか?

しかし、テストでは、仮想演算子++と仮想演算子*演算子が私のアルゴリズムの実際のボトルネックになっていることがわかりました。私はそれをスピードアップするために何かができるかどうか疑問に思っています。抽象化のため、インライン展開はおそらく私にとってはうまくいかないでしょうか?

私はconstイテレータも提供したいと思います。私は現在のクラス設計でこの作業をどうやって行うのか分かりません。私のオリジナルの質問(Fast and flexible iterator for abstract class)を参照すると、Tの代わりにconst Tを持つSTL順方向イテレータからConstGridIteratorをサブクラスとして作成できますか?または、すべてのイテレータクラス(GridIteratorおよびbaseImpl)のconstバージョンを実装する必要がありますか?

答えて

3

STLとして行い、イテレータまたはコンテナで仮想メソッドを使用しないでください。ほとんどのコンパイラは、最適化を求められると、ほとんどのSTLイテレータを完全にバイパスし、オブジェクトファイルにも存在しない点まで最適化することができます。例えば、*(vector<T>.begin()+5)は、vector<T>::iteratorがコンストラクタ、デストラクタ、および複素演算子の再定義を伴う複合クラスであっても、vector<T>.__underlying_array[5]に最適化できます。

方法が何によって再定義される可能性があるため、正しくこれを最適化するために、コンパイラを防ぐため、どこにでもoperator++の呼び出しスタック内の仮想メソッド呼び出しを持つbegin()end()またはoperator !=()。仮想メソッドは実行時のオーバーヘッドが小さくなるだけでなく、モジュールをよりモジュラ化することでコードを最適化できなくします。

パフォーマンスが必要な場合は、継承の代わりにテンプレートを使用するか、コンパイラを微調整して、誰もこのクラスを継承しないと言ってください。これは現在のデザインと競合する可能性がありますが、パフォーマンス、モジュール性、コストの3つの中から2つの優先順位を選択する必要があります。