Jupp, daß Generics eher Templates sind, wo man die Typprüfung schon beim Parsen des Templates macht, anstatt dort nur eine Syntaxprüfung vorzunehmen und die eigentliche Typprüfung erst bei der Verwendung zu machen ... also das ist schrottig und behndert die Nutzung der Generics teilweise extrem.
Ich persönlich find es gut, dass die Typüberprüfung bereits bei der Definiton des Generics stattfindet. Das hilft Fehler schneller zu finden, als wenn du das erst bei der Spezialisierung mit einem bestimmten Typ hast... Free Pascal ist hier etwas laxer und hat zum Beispiel kein Problem damit, wenn du
T.Something
für ein
T
schreibst, das keinen Constraint hat...
Was bei den Generics ausfällt, ist daß der Code in der
Unit ist, wo der generische Typ entgültig definiert wurde und mir scheint es manchmal auch so, als wenn er dann bei mehreren Units auch mehrmals einkompiliert wird.
Das hat sx2008 bereits recht gut erläutert.
Zur Laufzeit werden dann noch
RTTI Daten erzeugt (bei normalen Klassen geschieht dies zur Compile-time).
Du meinst doch sicher zum Zeitpunkt der Spezialisierung zur Compilezeit, oder? Dass die
RTTI Daten rein zur Laufzeit erzeugt werden, kann ich mir nicht wirklich vorstellen...
Wenn das Generic + Datentyp(en) nur im Abschnitt implementation auftaucht dann weiss der Linker nicht dass es dieses konkrete Generic schon gibt.
Und so kommt es, dass genau der gleiche Code in mehreren Units stecken kann ohne dass der Linker diese Duplikate zu einem zusammenführen kann.
Der Linker könnte schon den gleichen Code zusammenfassen, indem er nach gleichem Code sucht. Aber Embarcadero möchte das gar nicht
, sonst hätte ich das schon längst zu XE2 Zeiten als Linker-Aufsatz bereitgestellt.
Weißt du, warum Embarcadero das nicht möchte? Für Free Pascal plane ich nämlich in Zukunft genau das als Whole Program Optimization Option anzubieten... (und zusätzlich will ich den Compiler beim Spezialisieren überprüfen lassen, ob die selbe Spezialisierung bereits im Interface einer verwendeten
Unit vorkommt, damit er diese dann verwendet; das macht FPC aktuell nämlich nicht, dazu muss ich aber erst
class var
in Verbindung mit Generics korrigieren)
Gruß,
Sven