Thread View: de.comp.lang.c++
2 messages
2 total messages
Started by Gerhard Traeger
Tue, 05 Mar 1996 22:16
most-faq: template instantiation&compiler specifics
Author: Gerhard Traeger
Date: Tue, 05 Mar 1996 22:16
Date: Tue, 05 Mar 1996 22:16
70 lines
4224 bytes
4224 bytes
uz@wuschel.ibb.schwaben.com (Ullrich von Bassewitz) hat geschrieben: >> 1. Borland-C++: >> ... >> 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. Oder wenn man bei der Suche nach der richtigen Schnittstelle nicht immer die ganze Quelle durchstoebern will. C erlaubt durch das header-Konzept immerhin die Trennung von Schnittstellen- deklaration und Implementation. Die OOP-Unterstuetzung von C++ kann doch wohl nicht bedeuten, dass ich selbst auf diesen bescheidenen Ansatz der Objektbildung verzichten muss. Mein derzeitiges Lieblingsspielzeug hat ca. 30 000 dichtbeschriebene Zeilen Quellcode. Wenn ich da alle template-member-Funktionsdefinitionen in die Header packen muss finde ich nichts mehr! >> 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. Wenn es funktionieren wuerde, waere es ideal: man deklariert die templates in einer header-Datei (inclusive inline-Funktionen), definiert die nicht- inline-Funktionen in der zugehoerigen *.c-Datei und braucht sich bei der Verwendung nur noch fuer die Information in der header-Datei interessieren. Keinerlei Verwaltungsaufwand, Compiler und Linker sorgen fuer optimale Instanzenbildung. >> 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 bin zwar gegen lange Zitate, aber das hier verstehe ich komplett nicht. Wie soll es zu "multiple defines" kommen, wenn die nicht-inline-template- member-Funktionen genau einmal, naemlich beim Uebersetzen der Quelle, in der sie stehen, fuer alle angeforderten Instanzen gebildet werden? Wieso muss man hierbei wissen, wo sich in einer Klassenhierarchie ein Template befindet? Nach meinem Wunsch (die explizite Instanzenbildung im header mit der Deklaration, via "template class ...", anzuordnen und damit fuer den Verwender des headers sichtbar zu machen) ist es doch voellig egal, ob eine Klasse "selbstaendig", oder die Instanz eines templates ist! So wie es jetzt moeglich ist, mit "template class ..." in der Definitionsdatei, bekommt man eben erst beim linken eine saubere Fehlermeldung, die einem sagt, wo etwas zu tun ist. Gerade wenn mehrere an einem Projekt arbeiten, ist die Borland-Methode nach meinem Verstaendnis unhaltbar. Der Benutzer eines Programmes soll mit dessen Implementation so wenig wie moeglich zu tun haben. Es kann aber durchaus sinnvoll sein, wenn nur die Instanzen eines Templates erlaubt sind, die ihr Programmierer auch getestet hat! MfG, Gerhard.
Re: most-faq: template instantiation&compiler specifics
Author: Ullrich von Bassewitz
Date: Sun, 10 Mar 1996 10:47
Date: Sun, 10 Mar 1996 10:47
67 lines
3975 bytes
3975 bytes
Gerhard Traeger (gerhard@gt-priv.m.eunet.de) wrote:
> C erlaubt durch das header-Konzept immerhin die Trennung von Schnittstellen-
> deklaration und Implementation. Die OOP-Unterstuetzung von C++ kann doch
> wohl nicht bedeuten, dass ich selbst auf diesen bescheidenen Ansatz der
> Objektbildung verzichten muss.
Es hat in C++ (genauso wie in C) noch nie ein Modulkonzept im Sinne des
Modulkonzepts von Modula 2/3 oder Ada gegeben. Die von Dir beschriebene
Trennung war keine (weil der Compiler sich nicht dafuer interessiert),
sondern wurde dem Programmierer mit Hilfe des Praeprozessors vorgegaukelt.
Aus dem Grund ist das was Du da vorbringst ein voellig konstruiertes
Argument. Was hindert Dich, Deine Implementation in ein .cc File zu
schreiben, und am Ende Deines Header Files ein #include "xxx.cc"
hinzuzufuegen? Wenn Du Code und Implementation in zwei verschiedenen Files
haben willst - bitteschoen, nichts hindert Dich daran.
> Mein derzeitiges Lieblingsspielzeug hat ca. 30 000 dichtbeschriebene Zeilen
> Quellcode. Wenn ich da alle template-member-Funktionsdefinitionen in die
> Header packen muss finde ich nichts mehr!
Wenn das so ist, dann muss es wohl an den 30000 Zeilen liegen, und nicht an
der Tatsache, dass der Compiler beim Uebersetzen den Code der Templates
sehen will. Bis auf die eben erwaehnte eine Zeile unterscheidet sich das
naemlich nicht von der zweiten Moeglichkeit, die Du aufgefuehrt hast.
[Cfront und Sun Loesung]
> Wenn es funktionieren wuerde, waere es ideal: man deklariert die templates
> in einer header-Datei (inclusive inline-Funktionen), definiert die nicht-
> inline-Funktionen in der zugehoerigen *.c-Datei und braucht sich bei der
> Verwendung nur noch fuer die Information in der header-Datei interessieren.
> Keinerlei Verwaltungsaufwand, Compiler und Linker sorgen fuer optimale
> Instanzenbildung.
Es ist ein Heidenaufwand notwendig, nur um eine Zeile im Header File zu
sparen. Natuerlich habe ich nichts gegen eine solche Loesung (wenn sie
funktioniert), ich frage mich jedoch, welchen Sinn es macht, diesen Aufwand
zu treiben, wenn das Resultat auch viel einfach zu haben ist. Daher auch
mein "ich kann keine Vorteile dieser Loesung erkennen". Wenn Du das
Einsparen der oben erwaehnten "#include..." Zeile als Vorteil ansiehst...
naja.
> Wie soll es zu "multiple defines" kommen, wenn die nicht-inline-template-
> member-Funktionen genau einmal, naemlich beim Uebersetzen der Quelle, in
> der sie stehen, fuer alle angeforderten Instanzen gebildet werden?
Weil es in der Verantwortung des Programmierers (nicht des Schoepfers der
Library) liegt, wo welche Templates instantiiert werden. Wenn der das
vergisst oder aus Versehen zweimal durchfuehrt, dann geht die Suche los.
Wenn Du die explizite Instanzenbildung im Header File machst, dann wird
jedesmal eine Instanz erzeugt, wenn ein Modul von Dir dieses Header File
verwendet. Folgerichtig ist der Code mehrfach vorhanden und Du bekommst ein
"multiple definition" vom Linker. Wenn Du, um diesen Fehler zu umgehen dem
Linker beibringst, Templates zu erkennen und ueberfluessige Instanzen
rauszuschmeissen, dann wird Deine Loesung noch unsinniger, weil Du dann
genausogut dem Compiler sagen kannst, er solle alle Instanzen einfach
automatisch erzeugen (dazu braucht er dann eben die Definition), und Du
hast das, was Du als "Borland Methode" bezeichnest.
Gruss
Uz
--
Ullrich von Bassewitz uz@ibb.schwaben.com
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads