0

THEVARIABLE を THECLASS にキャストしようとすると、0 が返されることを読みdynamic_cast<THECLASS>(THEVARIABLE)ました (THEVARIABLE が THECLASS のクラスではなく、THECLASS の子孫でもないと仮定します)。ランタイム チェックを行う必要があるため、dynamic_cast の方が遅いと聞きました。オブジェクト チェックのために多くのループを実行した場合、dynamic_cast は遅くなりませんか (100 個のオブジェクトなど)。

次のような型チェックを行う静的クラスを作成した場合、それはより良い (より速い?) でしょうか? (構文エラーがあれば無視します):

class TYPECHECK {
public:
inline static bool isInt(int a) {
   return true;
}
template<typename wrongtype>
inline static bool isInt(wrongtype a) {
   return false;
}

[...]

private:
TYPECHECK();

};

int main() {
   int a = 5;
   char b = 'd';
   TYPECHECK::isInt(a);   //true
   TYPECHECK::isInt(b);   //false
   return 0; 
}

intだけでなく、より複雑な型に対してこれを行ったと仮定します。このクラスの実装は、for ループ内にある場合、dynamic_cast (チェックに使用) よりも高速でしょうか?

前もって感謝します。

編集

twsansbury には、訪問者パターンの例を推奨して含めるための適切な回答があります。

4

4 に答える 4

3

プロファイルを作成する必要がありますが、おそらくそうではありません。ある程度のオーバーヘッドはありますがdynamic_cast、最適化されており、適切な実装では、ユーザーが実装したタイプ識別方法よりもはるかに高速である必要があります。

ただし、IMOを使用すると、多くのキャストが必要になる場合は、デザインを改善できます。それについて尋ねたほうがいいです;)

また、dynamic_castポインタにキャストした場合にのみNULLが返されるわけではありません。

于 2012-08-06T06:49:56.143 に答える
1

何のためにそれが必要かはわかりませんが、ブーストの多形キャストを見ることができます-polymorphic_castそしてpolymorpihc_downcasthttp://www.boost.org/doc/libs/1_50_0/libs/conversion/cast.htm

これらは基本的dynamic_castにDEBUGおよびstatic_castRELEASEと同じように機能するため、DEBUGで実行するときは安全であり、RELEASEで実行するときは速度があります。

于 2012-08-06T06:56:52.773 に答える
1

心に留めておいてください、必要性dynamic_castはアーキテクチャの問題を意味します。仮想メソッドについて考えてみましょう。

于 2012-08-06T07:21:41.307 に答える
0

継承階層も同様にウォークスルーすると思いますdynamic_castので、あなたが言ったように自分でそれを行っている場合は、将来追加する新しいクラスがここでチェックに追加されていることを確認する必要があります. これは簡単に思えますが、非常にエラーが発生しやすく、そのようなことは簡単に忘れてしまい、これに取り組んでいる新しい開発者はこれらすべてを学ばなければなりません。

とはいえ、パフォーマンスに関しては、プロファイリングする必要がありますが、動的キャスト内に含まれる間接的なほとんどが最適化されて除去されるため、大きな違いがあるとは思えません。

于 2012-08-06T07:01:24.983 に答える