Frage

LLVM hat seine eigene Hand Alternative zu RTTI gerollt, die eine Verbesserung der Geschwindigkeit über eingebaute in RTTI ist und ohne V-Tabelle (dyn_cast) Klassen dynamische Gießen ermöglicht. Allerdings kann es immer noch in genau die Art und Weise verwendet wird, dass dynamic_cast<> verwendet wird, obwohl sie es mit mehreren Klassen verwendet werden erlaubt.

dyn_cast<> Vorlage Dokumentation

LLVM ist ein seriöses C ++ Projekt so ist dies angesichts den gemeinsamen zu fliegen scheint zu sagen, dass zu viele dynamischen Casts ein Zeichen für schlechtes Design, auch als Codegeruch bekannt. Sicherlich eine bessere Durchführung dynamische Umwandlung tut nichts, seine Verwendung in Design als ein Standard-dynamic_cast zu verbessern. Also, wer ist hier richtig? Gibt es Fälle, in denen großflächige Verwendung von dynamischen Gießen eine gute Design Wahl ++ Code in C? Google schaltet sie 690 Vorkommen dieser Art von dynamischem Gießen in der LLVM Stamm Quellcode auf.

Verwendung von dyn_cast<> in LLVM Stamm

War es hilfreich?

Lösung

Während Performance Hits sind ein Grund dynamic_cast<> für große Klassenhierarchien zu vermeiden, ist es nicht der einzige Grund, warum Sie vielleicht, sie zu vermeiden. Bessere Durchführung oder nicht, sollte man nicht mehr gefördert werden dyn_cast<> zu verwenden, da diese Behauptung.

Auf der anderen Seite gibt es absolut nichts falsch mit der Verwendung von dynamic_cast<>, wenn es das beste Werkzeug für den Job. Wenn seine Verwendung gerechtfertigt ist, und der sauberste Weg, um ein Problem zu lösen, dann ist es immer richtig, unabhängig von dem „gemeinsamen Spruch“.

würde ich sicher nicht meiden beliebte Projekte, nur weil sie dynamic_cast<>s, gotos oder andere Idiom verwenden, die in Ungnade gefallene.

Andere Tipps

ich denke, Dynamik Abgüsse schlecht sind, nicht weil sie langsam sind, sondern weil sie bedeuten, dass Ihr Code zu eng gekoppelt ist.

ich nur einen sehr kurzen Blick auf die Implementierung von dyn_cast und isa in der LLVM Dokumentation genommen haben.

Der exmaple im Code hat folgende Möglichkeiten:

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;
}

Der Test mit einem B genannt wird und verfügt über:

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

Wenn ich verstehe, was richtig los ist, die isa Vorlage (die von dyn_cast verwendet wird) verwendet die explizite Spezialisierung von isa_impl zu Linkleiste mit foo. In den genannten Beispielen scheint es, dass isa<foo>(B1) gibt true zurück!

Wie auch immer, das ist sehr unterschiedliches Verhalten zu der dynamic_cast, so dass ich glaube wirklich nicht, Sie sie gegeneinander vergleichen können.

Natürlich, ich kann falsch zu verstehen, was LLVM tut, so lassen Sie es mich wissen, wenn ich den Code nicht verstanden haben!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top