 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Dietmar Kuehl Guest
|
Posted: Wed Jan 25, 2006 3:07 pm Post subject: Re: function template nur in header-datei möglich? |
|
|
Rolf Magnus wrote:
| Quote: | Dietmar Kuehl wrote:
Ernst Murnleitner wrote:
Ein Template muss ja im header-file definiert sein.
Kann man das irgendwie umgehen.
Ja. Es gibt zwei Möglichkeiten:
1. Man kann Templates exportieren. Dazu braucht man allerdings einen
Compiler, der dies unterstützt, und diese sind derzeit eher
dünn gesät (einige EDG-basierte Compiler unterstützen derzeit
export, etwa Comeau und Intel).
2. Man kann die Templates in dem File, wo man sie definiert,
explizit für die benötigten Typen instanziieren. Diese Möglichkeit
unterstützen eigentlich alle Compiler, allerdings ist das nur
praktikabel, wenn man relativ wenige Typen hat, für die man das
Template instanziieren will.
3. Die Implementation einfach in ein Implementationsfile schreiben und
dieses am Ende der Headerdatei #includen und nicht als eigene
Übersetungseinheit durch den Compiler laufen lassen.
|
In welchem Sinne ist das Template in diesem Fall nicht im Header-File
definiert? Alles, was in einem Header-File eingebunden wird, gehört
für mich zu dem Header-File, auch Files, die eigentlich eher nach
Implementierungen aussehen. Aus organisatorischer Sicht mag es es
einen Unterschied geben, aus Compiler-Sicht jedoch nicht.
--
<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
<http://www.eai-systems.com> - Efficient Artificial Intelligence
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Wed Jan 25, 2006 3:41 pm Post subject: Re: function template nur in header-datei möglich? |
|
|
Dietmar Kuehl wrote:
| Quote: | 3. Die Implementation einfach in ein Implementationsfile schreiben und
dieses am Ende der Headerdatei #includen und nicht als eigene
Übersetungseinheit durch den Compiler laufen lassen.
In welchem Sinne ist das Template in diesem Fall nicht im Header-File
definiert? Alles, was in einem Header-File eingebunden wird, gehört
für mich zu dem Header-File, auch Files, die eigentlich eher nach
Implementierungen aussehen. Aus organisatorischer Sicht mag es es
einen Unterschied geben, aus Compiler-Sicht jedoch nicht.
|
Ich hatte angenommen, daß es gerade um die organisatorische Sicht geht. Die
Implementationen stehen physikalisch nicht in der Header-Datei, sondern wie
von den anderen Klassen gewohnt in einer extra-Implementationsdatei. Wie
das aus Compiler-Sicht aussieht, ist dabei doch eigentlich egal, oder?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Dietmar Kuehl Guest
|
Posted: Wed Jan 25, 2006 10:14 pm Post subject: Re: function template nur in header-datei möglich? |
|
|
Rolf Magnus wrote:
| Quote: | Ich hatte angenommen, daß es gerade um die organisatorische Sicht geht.
Die Implementationen stehen physikalisch nicht in der Header-Datei,
sondern wie von den anderen Klassen gewohnt in einer
extra-Implementationsdatei. Wie das aus Compiler-Sicht aussieht, ist dabei
doch eigentlich egal, oder?
|
Das sehe ich anders! Wenn man z.B. mit Optimierung compiliert, dann
kann es ganz schnell zu langen Compilierzeiten kommen, wennn man
komplexe Template-Systeme in Headern implementiert. Zum Beispiel
macht es einen signifikanten Unterschied, ob IOStreams und Locales
in Headern implementiert werden oder dort nur deklariert werden und
in separaten Files instantiiert werden, insbesondere wenn mit
Optimierung kompiliert wird.
--
<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
<http://www.eai-systems.com> - Efficient Artificial Intelligence
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Dietmar Kuehl Guest
|
Posted: Thu Jan 26, 2006 12:30 pm Post subject: Re: function template nur in header-datei möglich? |
|
|
Stefan Ram wrote:
| Quote: | Dietmar Kuehl <dietmar_kuehl (AT) yahoo (DOT) com> writes:
Das sehe ich anders! Wenn man z.B. mit Optimierung compiliert, dann
kann es ganz schnell zu langen Compilierzeiten kommen, wennn man
komplexe Template-Systeme in Headern implementiert.
From: Roedy Green
Message-ID: <kcndt1ti9s1mn2236p7gkg7rrn0813ee6k (AT) 4ax (DOT) com
(...)
A story. Back in my youth there was an Algol program to compute the
Nth prime of a certain class. For some reason the program took days
to compile. However when it executed it took no time at all. It had
at compile time unraveled the entire code so that the final program
was essentially
print("20988936657440586486151264256610222593863921");
|
Das ist der eine Teil der Geschichte. Der andere ist, dass es keinen
guten Grund gibt, die gleiche Berechnung in jeder Translation-Unit
zu machen. Wenn es nur relativ wenige Instanziierungen gibt, die aber
oft genutzt werden, wie etwa bei IOStreams und locales (dort gibt es
de facto eigentlich nur zwei Instanziierungen, obwohl es theoretisch
möglich wäre, die Klassen auch noch für andere Typen zu
instanziieren), dann kann man viel Zeit sparen, sie explizit zu
instanziieren.
--
<http://www.eai-systems.com> - Efficient Artificial Intelligence
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Thu Jan 26, 2006 5:22 pm Post subject: Re: function template nur in header-datei möglich? |
|
|
Dietmar Kuehl wrote:
| Quote: | Rolf Magnus wrote:
Ich hatte angenommen, daß es gerade um die organisatorische Sicht geht.
Die Implementationen stehen physikalisch nicht in der Header-Datei,
sondern wie von den anderen Klassen gewohnt in einer
extra-Implementationsdatei. Wie das aus Compiler-Sicht aussieht, ist dabei
doch eigentlich egal, oder?
Das sehe ich anders! Wenn man z.B. mit Optimierung compiliert, dann
kann es ganz schnell zu langen Compilierzeiten kommen, wennn man
komplexe Template-Systeme in Headern implementiert.
|
Dafür ist es aber irrelevant, ob der viele Extra-Code im Header oder in
einer physikalisch anderen Datei steht. Wenn der Code da ist, kostet er
Compilezeit. Und wenn der Entwickler sein Handwerk versteht, ist der
Code nur dann da, wenn es wirklich unbedingt notwendig ist. Und wenn
also die Notwendigkeit besteht, viel Template-Code in einem Header
unterzubringen, ist die Trennung in ".h" und inkludierte ".cc" durchaus
nicht unpraktisch. Da kann man z.B. die "zeige-mir-die-Definition-
dieser-Funktion"-Funktion seines Editors benutzen.
Dass es damit leicht ist, Bloat und ewig lange brauchende Compilerläufe
zu fabrizieren, ist natürlich klar. Aber dass es in C++ besonders
einfach ist, durch Nachlässigkeit Bloat zu erzeugen, ist glaube ich
nichts neues.
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Fri Jan 27, 2006 3:01 pm Post subject: Re: function template nur in header-datei möglich? |
|
|
Stefan Reuther wrote:
| Quote: | Dietmar Kuehl wrote:
Rolf Magnus wrote:
Ich hatte angenommen, daß es gerade um die organisatorische
Sicht geht. Die Implementationen stehen physikalisch nicht
in der Header-Datei, sondern wie von den anderen Klassen
gewohnt in einer extra-Implementationsdatei. Wie das aus
Compiler-Sicht aussieht, ist dabei doch eigentlich egal,
oder?
Das sehe ich anders! Wenn man z.B. mit Optimierung
compiliert, dann kann es ganz schnell zu langen
Compilierzeiten kommen, wennn man komplexe Template-Systeme
in Headern implementiert.
Dafür ist es aber irrelevant, ob der viele Extra-Code im
Header oder in einer physikalisch anderen Datei steht. Wenn
der Code da ist, kostet er Compilezeit.
|
Das stimmt nur teilweise. Wenn ich eine Klasse C mit den
Funktionnen f(), g() und h() definiere, liest der Compiler bei
der Compilierung von Client-Code lediglich nur die
Klassen-Definition, nicht aber die Definitionen der Funktionnen.
Auch dann, wenn ich die Funktion aufrufe. Ist aber C ein
Template, dann liest der Compler die ganzen
Funktiondefinitionnen bei jeder Compilierung von Client-Code.
Und häufig, wenn ich die Funktion f() aufrufe, wird sie auch
vollig kompliliert -- wenn ich sie in zwanzig unterschiedenen
Moduln benutze, dann wird bei einem kompletten Build derselbe
Code zwanzigmal compiliert, statt nur einmal.
| Quote: | Und wenn der Entwickler sein Handwerk versteht, ist der Code
nur dann da, wenn es wirklich unbedingt notwendig ist.
|
Die meisten Compiler sagen, dass die vollständige Definition der
Funktion notwendig ist, sofort die Funktion einen Template ist,
und benutzt wird. Bei nicht Templates kann ich die Funktion
benutzen, ohne dass der Compiler seine Implementierung sieht.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|