6

LLVMには、RTTIに代わる独自の手巻きの代替手段があります。これは、組み込みのRTTIよりも速度が向上し、vtable(dyn_cast)のないクラスへの動的キャストを可能にします。dynamic_cast<>ただし、より多くのクラスで使用できる場合でも、使用されている方法とまったく同じように使用できます。

dyn_cast<>テンプレートドキュメント

LLVMは評判の良いC++プロジェクトであるため、動的キャストが多すぎることは悪いデザインの兆候であり、コードの臭いとしても知られているという一般的な意見に直面しているようです。確かに、パフォーマンスの高いダイナミックキャストは、標準よりも設計での使用を改善するものではありませんdynamic_cast。では、誰がここにいますか?動的キャストの大規模な使用がC++コードの優れた設計上の選択である場合はありますか?Googleは、LLVMトランクのソースコードでこの種の動的キャストが690回発生することを明らかにしています。

dyn_cast<>LLVMトランクでの使用

4

3 に答える 3

7

大規模なクラス階層ではパフォーマンスの低下を避けるdynamic_cast<>理由がありますが、それだけが避けたい理由ではありません。dyn_cast<>パフォーマンスが優れているかどうかにかかわらず、この主張のために使用を奨励するべきではありません。

一方で、それdynamic_cast<>が仕事に最適なツールである場合に使用することに何の問題もありません。その使用が正当化され、問題を解決するための最もクリーンな方法である場合、「一般的な言い回し」に関係なく、それは常に正しいです。

私は確かに、人気のあるプロジェクトを避けようとはしません。なぜなら、それらがdynamic_cast<>s、gotos、または不利になっている他のイディオムを使用しているからです。

于 2009-10-24T13:55:50.993 に答える
1

ダイナミクスキャストは遅いからではなく、コードが緊密に結合されていることを意味しているため、悪いと思います。

于 2009-10-23T00:56:32.387 に答える
-1

LLVMドキュメントのdyn_castとisaの実装については非常に簡単に説明しました。

コードの例には次のものがあります。

struct bar {
  bar() {}
private:
  bar(const bar &);

};
struct foo {
  void ext() const;
  /*  static bool classof(const bar *X) {
    cerr << "Classof: " << X << "\n";
    return true;
    }*/
};

template <> inline bool isa_impl<foo,bar>(const bar &Val) {
  errs() << "Classof: " << &Val << "\n";
  return true;
}

テストはで呼び出され、次のようにBなります。

if (!isa<foo>(B1)) return;
if (!isa<foo>(B2)) return;

何が正しく行われているのかを理解している場合、isaテンプレート(によって使用されるdyn_cast)は、の明示的な特殊化を使用して、isa_implバーをfooにリンクします。与えられた例では、それisa<foo>(B1)はtrueを返すようです!

とにかく、これはdynamic_castの動作とは非常に異なる動作なので、実際にはそれらを相互に比較できるとは思いません。

明らかに、LLVMが何をしているのか誤解している可能性があるので、コードを理解していない場合はお知らせください。

于 2009-10-23T09:36:19.397 に答える