2011-07-20 18 views
0

は、私は以下のクラスを持っています。それらの違いは、動作に依存するisTerm()の評価方法にのみあります。 State-derivedクラスのすべての種類で動作するように設計された他のテンプレートクラスがいくつかあるのではなく、仮想関数bur override関数isTermを使用しないでください。それらの 一つはポリシー:C++パフォーマンスのためにキャスト多型クラス、仮想関数と

template <class S> 
class Policy 
{ 
    protected:  
    float QValue; 
    S *state; 
    S *nextState; 
    public: 
    ... 
    template <class P> 
    void updateOptimal(boost::ptr_vector<P> &policies); 
} 

updateOptimalは(行動に依存する)状態の派生クラスを取得する必要があり、アップキャスト状態から* ptrは何に現在使用されているS型はためには、その州のポリシーを検索します。今、国家の派生クラスが多型であるため、私はそれを行うには正しいことだったと仮定:ITERは、アクションの反復子であり、各アクションはState *nextstate; のポインタアクション(Action)を持っている

S *s = dynamic_cast<S *>(iter->getNextState()); 

場所> nextstateが設定されています他のいくつかの時点で:

action->setNextState(dynamic_cast<State *>(state)); 

私はState *nextstate;を使用して回避しS *nextstate;を使用するためには、クラス全体のアクションをテンプレート化できますが、それはプロジェクト全体の変化の膨大な量を必要とします。

cplusplus.comのキャストチュートリアルを読むことは、アップまたはキャストダウンの前にタイプチェックを行うので、dynamic_castを使用することが最善であると私は理解しています。

P *temp_pol = var::findPolicy(policies,s); 

findPolicyがどこにあるか:

template <class P, class S> 
P* findPolicy(boost::ptr_vector<P> &policies,S *state); 
  • はそれがにOKだろう、私はアップに何もしない鋳造後に次のコードでただし は、検索のためにそれを使用するよりも、他の状態をキャスト安全チェックをスキップし、静的キャストを使用しますか?私は それを試して、それをコンパイルします。
  • チェックをすべてスキップしてreinterpret_castを実行しても問題ありませんか? 私もそれを試してコンパイルします。
  • dynamic_castを実行する場合のペナルティはいくらですか?私はtheresを小さいと知っている オーバーヘッド、それは何か深刻ですか?
  • 多態性クラス を使用せずにState * ptrからSタイプ* ptrにアップキャストする方法はありますか(仮想関数を避け、単に を上書きする)?
+4

*私はむしろ仮想関数*を使用しません。なぜあなたの問題を解決するために設計されたツールを使用したくないのですか? –

+0

オーバーヘッドとサイズも増え、パフォーマンスが問題であると私は理解しているからです。 –

+2

これは当てはまりますが、オーバーヘッドが非常に小さいので、そのような最適化が本当に価値があるかどうかを確認するためにいくつかのプロファイリングを行う必要があります。多量のオブジェクトと仮想関数呼び出しがある場合にのみ影響します。これらのメカニズムは非常に最適化されています。 –

答えて

4

static_castdynamic_castの違いは、ヌル・ポインタまたは(あなたが参照をキャストしている場合)bad_cast -exceptionに無効dynamic_cast結果中に無効なstatic_castは、未定義の動作であるということです。 dynamic_castのペナルティは、実行時の型チェックであり、RTTIのためにコードサイズが増加します。

キャストが常に正常であると確信できる場合は、static_castを安全に使用できます。 reinterpret_castを使用しても、static_cast以上のパフォーマンス向上は得られませんので、ここでは使用しないでください。

+2

+1 'reinterpret_cast'は何のメリットももたらさず、実際にシステムを台無しにするかもしれません。ベースサブオブジェクトと派生オブジェクトが同じメモリアドレスに配置されている(ベースにオフセットがある可能性がある)という保証はなく、再解釈キャストによって完全に無視されるため、未定義の動作が発生します –

関連する問題