C++ wurde kritisiert, da es keine separate Zusammenstellung von Vorlagen gibt. C++ - Vorlagen werden für (virtuell) jede Instanziierung kompiliert. Wie ist der Stand der Dinge für Rust bezüglich der getrennten Zusammenstellung von Generika? Mein Verständnis ist, dass es sich wie C++ verhält, außer dass Instanziierungen während der Zusammenstellung jeder Kiste zwischengespeichert werden. Ist das korrekt ?Separate Kompilation für Generika in Rust
Antwort
Soweit ich weiß, werden Generika in irgendeiner serialisierten Form in der Kiste gespeichert, in der sie definiert sind. Wenn sie in einer anderen Kiste (Bibliothek oder Binärdatei) verwendet werden, werden sie aus dieser serialisierten Form instanziiert. So werden sie auf die gleiche Weise monomorphisiert wie C++ - Templates, aber der Aufwand beim wiederholten Parsen von unnötigem Code wird vermieden.
aus dem Tutorial-Dokumentation:
Der Rust-Compiler kompiliert generische Funktionen sehr effizient, indem sie monomorphizing. Die Monomorphisierung ist ein fantastischer Name für eine einfache Idee: Generiere eine separate Kopie jeder generischen Funktion an jeder Aufrufstelle, eine Kopie, die auf die Argumenttypen spezialisiert ist und somit speziell für sie optimiert werden kann. In dieser Hinsicht haben Ruts Generika ähnliche Leistungsmerkmale wie C++ - Templates. http://doc.rust-lang.org/0.11.0/tutorial.html#generics
EDIT: dies Ihre Frage nicht wirklich beantworten, es getan hat?
Dieser Text ist genau, warum ich vermutete, dass es das gleiche wie in C++ ist. Ich möchte jedoch etwas expliziteres hören. – Gepp
Generische Typen und Funktionen sind monomorphisiert. Es ist jedoch möglich, Merkmale ohne Generika zu verwenden.
Dies ist eine generische Funktion. Es wird monomorphisiert werden.
fn get_length<T: Collection>(collection: &T) -> uint {
collection.len()
}
Dies ist eine äquivalente nicht generische Funktion. Nur eine Kopie dieser Funktion wird in der Binärdatei enthalten sein.
fn get_length(collection: &Collection) -> uint {
collection.len()
}
Beachten Sie, dass wir nicht eine Funktion machen könnte, die einen Collection
von Wert erhält, weil Collection
ein Merkmal ist, und damit hat es keine spezifische Größe. Eine generische Funktion ist in diesem Fall erforderlich.
Es gibt einige Dinge, die Sie nicht mit Generika und einigen Dingen tun können, die Sie mit Merkmalsverweisen nicht tun können. Bei Merkmalsreferenzen brauchst du natürlich eine Eigenschaft. Bei Generika können Sie keinen Vektor von Sammlungen haben, in denen die Sammlungen unterschiedliche Typen haben (z. B. konnten Sie keinen Vec<int>
und keinen String
in diesen Vektor einfügen), aber Sie können mit Merkmalsreferenzen: a Vec<&Collection>
können ein &Vec<int>
und a .
- 1. Separate Kompilation
- 2. Probleme beim Verstehen von Merkmalen und Generika in Rust
- 3. Warum legt Rust manchmal ein :: vor die Parameter in Generika?
- 4. Java-Reflektion für Generika
- 5. Einzelne oder separate Datenbanken für separate Kundenkonten?
- 6. Xcode Kompilation auf Gerät
- 7. Set Kompilation Ebene für aspectj Weber in IntelliJ IDEA
- 8. Rust:
- 9. Rust leerer Wert für Ausdruck
- 10. Mehrere Rust-Quelldateien für Fracht
- 11. Merkmal für numerische Funktionalität in Rust
- 12. Generika in Index für die schnelle
- 13. C# Wörterbuch initializer Kompilation Inkonsistenz
- 14. .Net Native - Typ nicht in Kompilation
- 15. Wie Klammern für Generika verwenden?
- 16. Schritt für Schritt interaktiver Debugger für Rust?
- 17. Auf Kompilation von The Qlobe
- 18. Pseudo-Generika in C
- 19. mem :: ersetzen in Rust
- 20. Grunt PostCSS Kompilation sehr langsam
- 21. Kompilation Problem mit Split/Splitter
- 22. Kann Rust generische Typen löschen oder nicht?
- 23. Upcasting in .NET Generika
- 24. Separate Lese-/Schreibverbindung für SubSonic
- 25. Separate Verbindungszeichenfolge für verschiedene Umgebungen
- 26. separate Datei für Routen in Express
- 27. Codebeispiele in separate Datei für Sandcastles einfügen
- 28. Separate WHERE IN-Bedingungen für jede Spalte
- 29. separate Felder für eine Zeichenfolge
- 30. separate Protokolldateien für verschiedene Anwendungen
Ich bin ein wenig verschwommen auf, wo Vorlagen in C++ passen, aber in Rust, wo Makros betroffen sind, können Sie das erweiterte Formular mit '--pretty expanded' erhalten. Aber keine Generika. –
Eigentlich ist das eigentliche Problem in C++ nicht, dass Templates für jede Instanziierung kompiliert werden: Clevere Compiler führen Memoization durch und haben einen Cache mit einer Anzahl von "vorkompilierten" Instanziierungen einer Vorlage für einige gegebene Typen/Werte. Das Hauptproblem ist * separate Kompilierung * kombiniert mit '# include', die Vorlage muss in Kopfzeilen sein, so wird unnötigerweise in jeder einzelnen Übersetzungseinheit geparst, ob sie verwendet wird oder nicht. Dieses Problem wird mit Modulen verschwinden (C++ 17 vielleicht?). –