Ist LLVM eine Ausnahme von der Regel zur Vermeidung von dynamischen Abgüsse?
-
05-07-2019 - |
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.
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, goto
s 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!