Template Code verbergen
-
Hi, gibt es eine Möglichkeit die Implementation von Funktionen in generischen Template-Klassen zu verstecken. Ich möchte vermeiden dass der Code sichtbar ist. Geht das? Evtl. mit dem Pimpl-Idom?
Gruß Templer
-
Templer schrieb:
Geht das?
Nein. Du kannst die Implementation in seperate Headerfiles auslageren (Endung hpp, tcc, icc, etc.), aber sichtbar sind sie dann immer noch.
Immer gut ist jedoch, Teile, für die T nicht unbedingt notwendig ist, in normale Funktionen auszulagern (kannst auch T.xyz_member als Parameter übergeben). Dann wird der Bytecode weniger aufgebläht und du hast deine Trennung.
-
Aber dann schaut euch mal z.B. diese Vector-Klasse
www.ipf.tuwien.ac.at/opals/opals_docu/Vector_8hpp_source.html
an. Dort wird scheinbar das Pimpl-Idom verwendet um die Implementierung zu verbergen.00047 class Impl; 00048 Impl *pimpl_;Oder täusche ich mich diesbezüglich.
-
Zunächst: Es handelt sich nicht um Template-Klassen, sondern um Klassen-Templates bzw. Klassenvorlagen. Generell muss der Code einer Klassenvorlage dem Compiler bekannt sein, wenn er eine Klasse daraus konkretisieren soll.
Wenn ich das hier richtig lese, haben die für opals::Vector ein paar Klassen vorkonkretisiert, für die entsprechende Symbole dann aus der DLL exportiert werden. Das erreicht man durch explizite Konkretisierung, wobei die Klassenvorlage dann nur mit den vorkonkretisierten Parameterkombinationen benutzbar ist.
-
Was du machen kannst, ist eine gemeinsame Basisklasse machen, von der alle konkreten Instanzierungen ableiten. Diese Basisklasse könnte dann z.B. die Speicherverwaltung mittels void* enthalten, die abgeleiteten Klassen können dann casten. Das hat außerdem den Vorteil, dass der ausführbare Code kleiner wird.
-
Type Erasure ist auch eine häufig benutzte Technik, um verschiedene Implementierungen unter einem Typen anzusprechen und Template-Bloat zu vermeiden. Ist im Prinzip das, was Pi anspricht.
Verhindern, dass die konkreten Klassen mit einem Typ instanziiert werden, kann man nicht. Jedoch kann man die Abhängigkeiten klein halten, sodass nur ein kleiner Teil des Codes diesen Typen kennen muss.
-
314159265358979 schrieb:
Das hat außerdem den Vorteil, dass der ausführbare Code kleiner wird.
Und den Nachteil, dass (in den meisten Fällen) die Ausführungsgeschwindigkeit sinkt.
-
ProgChild schrieb:
314159265358979 schrieb:
Das hat außerdem den Vorteil, dass der ausführbare Code kleiner wird.
Und den Nachteil, dass (in den meisten Fällen) die Ausführungsgeschwindigkeit sinkt.
Wodurch soll hier die Geschwindigkeit sinken?
-
314159265358979 schrieb:
Wodurch soll hier die Geschwindigkeit sinken?
Schon alleine dadurch, dass zusätzlicher Funktionsaufruf benötigt wird.
-
314159265358979 schrieb:
Wodurch soll hier die Geschwindigkeit sinken?
virtual ist eine Optimierungsgrenze. Insbesodnere wnen dann so lustige void*-Zeiger frickeleien hinzu kommen.