2

以下のコードを遵守してください。私の知る限り、dynamic_castはstatic_castよりも遅いです。実行時に型を評価するためです。ここでの私の疑問は、以下のようにtypeid()でstatic_castを使用する場合、動的キャストと同じ時間がかかるでしょうか?? dynamic_castよりも高速ですか?

class Shape
{ 
public:
  virtual ~Shape(){}
};
class Circle : public Shape{ };
class Square : public Shape{ };

RTTIを使用した静的キャスト:

Circle c;
Shape* s = &c; // Upcast: normal and OK

// More explicit but unnecessary:
s = static_cast<Shape*>(&c);
// (Since upcasting is such a safe and common
// operation, the cast becomes cluttering)

Circle* cp = 0;
Square* sp = 0;

// Static Navigation of class hierarchies
// requires extra type information:
if(typeid(s) == typeid(cp)) // C++ RTTI
    cp = static_cast<Circle*>(s);
if(typeid(s) == typeid(sp))
    sp = static_cast<Square*>(s);
if(cp != 0)
    cout << "It's a circle!" << endl;
if(sp != 0)
    cout << "It's a square!" << endl;

ダイナミックキャスト:

Circle c;
Shape* s = &c; // Upcast: normal and OK

s = &c;
Circle* cp = 0;
Square* sp = 0;
cp = dynamic_cast<Circle*>(s);
    if(cp != 0)
    cout << "It's a circle!" << endl;
sp = dynamic_cast<Square*>(s);
if(sp != 0)
    cout << "It's a square!" << endl;
4

4 に答える 4

7

タイプをテストしてから実行する方が高速ですstatic_castが、操作は同等ではありません。これは、最も派生したタイプへのダウンキャストのみを許可するためです(中間レベルはと一致しませんtypeid)。より堅牢なので使用dynamic_castします(たとえば、誰かがタイプを拡張してポインターを渡しても壊れません)。

dynamic_castアプリケーションでのパフォーマンスが問題になる場合は、設計を再検討する必要があります。typeid+static_castはより高速ですがdynamic_cast、オブジェクトのランタイムタイプをオンにする必要がない方が、どのオブジェクトよりも高速です。

于 2012-09-25T18:28:39.127 に答える
3

これらのコードサンプルは論理的に同じではありません。dynamic_castクラスの継承を考慮に入れることを忘れており、typeid()を比較すると、継承ツリーのリーフ部分のみが比較されます。typeidが提供するのは、「そのオブジェクトの実際のタイプに関連する一意の識別子」だけです。typeid()だけでは、共通ベースのポインタへのキャストが可能かどうかを確認できません。チェックできるのは、runtimetype-of-thatがruntimetype-of-otherthingとまったく同じであるかどうかだけです。

そうは言っても、static_cast + typeidは一般的な意味ではやや速いはずですが、場合によっては間違った答えを返すだけだと思います。

于 2012-09-25T17:56:18.873 に答える
1

まともなコンパイラなら、両方の例を同じコードに最適化できると思います。ただし、確認する唯一の方法は、特定のツールチェーンの結果を測定することです。

于 2012-09-25T17:50:15.060 に答える
0

確実にする唯一の方法。std::chronoとhigh_resolution_clockを使用して測定します。

于 2012-09-25T17:42:52.043 に答える