Article View: de.comp.lang.c++
Article #1748Re: most-faq: template instantiation&compiler specifics
From: Ullrich von Bassewitz
Date: Mon, 04 Mar 1996 20:42
Date: Mon, 04 Mar 1996 20:42
64 lines
3393 bytes
3393 bytes
> 1. Borland-C++:
> Template-Deklaration und -Definition in die header-Datei schreiben, ein
> spezieller Linker filtert die entstandenen Redundanzen heraus.
> Nachteil:
> Damit kann man das Konzept:
> - header-Datei = Schnittstellendeklaration,
> - Programm-Datei = Programmimplementation,
> endgueltig vergessen. Und damit auch die Wartung groesserer Projekte.
Das ist nicht so schlimm, s.u.
Dumm allerdings, wenn man Bibliotheken verkaufen will.
Weiterer Nachteil (zumindest theoretisch): Laengere Uebersetzungszeiten, da
bei jedem #include der ganze Code uebersetzt werden muss. Das laesst sich
durch precompiled Headers weitgehend abfangen. Fazit: In der einfachsten
Variante sehr einfach zu implementieren, wenn man precompiled Headers haben
will sehr aufwendig. Dafuer helfen precompiled Headers aber auch bei
"normalen" Includes.
> 2. Cfront (AT&T, mit Einschraenkungen SUN C++):
Die Frage ist, welchen Vorteil diese Loesung bietet. Mir fallen auf Anhieb
zwar einige kleinere, aber kein entscheidender Vorteil ein. Zudem ist die
Loesung aufwendig in der Implementation.
> Bleibt als 3. Moeglichkeit die triviale Loesung der "expliziten
> Instanzenbildung"
Dieser Weg ist fuer kleine Programme gangbar. Fuer groessere Projekte mit
vielen Bibliotheken ist das praktisch nicht zu machen. Der Grund dafuer
liegt darin, dass man beim Verwenden einer Klasse immer genau wissen
muss, ob sich evtl. irgendwo in der Klassenhierarchie bis hinunter zur
Basisklasse irgendwo ein Template befindet. Oder ob irgendeine Klasse, die
man verwendet, vielleicht ein Objekt einer Template-Klasse oder einen
Abkoemmling davon als (evtl. private) Data-Member hat. Das Verfahren setzt
also eine Detail-Kenntnis der verwendeten Bibliotheken voraus, die weit
ueber das hinausgeht, was man zum normalen "nur Benutzen" der Bibliotheken
wissen muss.
Verschaerfend kommt natuerlich noch der umgekehrte Effekt: Die explizite
Instantiierung darf man nicht mehr als einmal machen, weil man sonst
"multiple defines" bekommt. Das ist enorm umstaendlich, wenn man zu mehrt an
einem Projekt arbeitet.
Ich behelfe mir bei den neueren Versionen von g++ mit dieser Methode - und
es ist jedesmal eine Kugelfuhr, herauszufinden, welches Template der
Compiler denn nun gerne instantiiert haette, und auch keines dabei mehrfach
zu erwischen.
Also ich denke, diese Moeglichkeit ist wesentlich schlechter fuer die
Wartbarkeit groesserer Projekte als die oben angefuehrte Methode, alles in
ein Header File zu packen. Natuerlich ist das auch keine besonders gute
Loesung, aber wenn meine Bibliothek einmal fertig ist, dann tut es immer.
Wenn ich explizite Instantiierung machen muss, dann habe ich - trotz
fertiger Bibliothek - andauernd ein Rumgemache in der Applikation.
Natuerlich nur meine Meinung...
Gruss
Uz
--
Ullrich von Bassewitz uz@ibb.schwaben.com
Technical Details
Message-ID:
<JF59B55G@wuschel.ibb.schwaben.com>Path:
arc1-ca.pugleaf.net!wuschel.ibb.schwaben.com!not-for-mailReferences:
<4hbknf$7nl@Dortmund.Germany.EU.net>Show Full Headers
Complete Article Headers
Newsgroups: de.comp.lang.c++ Path: arc1-ca.pugleaf.net!wuschel.ibb.schwaben.com!not-for-mail From: uz@wuschel.ibb.schwaben.com (Ullrich von Bassewitz) Subject: Re: most-faq: template instantiation&compiler specifics Date: 04 Mar 1996 20:42:03 GMT References: <4hbknf$7nl@Dortmund.Germany.EU.net> Message-ID: <JF59B55G@wuschel.ibb.schwaben.com> Reply-To: uz@ibb.schwaben.com Organization: Ingenieurbuero von Bassewitz X-Newsreader: TIN [version 1.2 PL2]