Hallo,
hab gerade die aktuelle c't bekommen und mir den Artikel Generische
Programmierung durchgelesen, wo es auch um C++ Templates geht. Was ich
nicht verstehe ist folgendes
[...] Die direkte Konsequenz daraus ist, dass Templates keine
uebersetzbaren Einheiten sind. Die Implementierungen von Template-
Methoden muessen in den Header-Dateien untergebracht werden. Bei der
STL bedeutet beispielsweise allein das Einfuegen der Praeprozessor-
Direktive
#include
Hi Ich glaube, mit so theoretischen Fragen bist Du hier nicht gut aufgehoben. Versuch es mal in de.comp.lang.iso-c++.
hab gerade die aktuelle c't bekommen und mir den Artikel Generische Programmierung durchgelesen, wo es auch um C++ Templates geht. Was ich nicht verstehe ist folgendes
[...] Die direkte Konsequenz daraus ist, dass Templates keine uebersetzbaren Einheiten sind. Die Implementierungen von Template- Methoden muessen in den Header-Dateien untergebracht werden. Bei der STL bedeutet beispielsweise allein das Einfuegen der Praeprozessor- Direktive #include
unter Linux eine Vergroesserung der Objektdatei um 36 kByte. Jede neue Instanz von list kostet weitere 17 kByte. [...]
Mal abgesehen davon dass ich eine Header-Datei
noch nie benoetigt habe (ich hab einfach immer <list>, ... verwendet), dachte ich bisher, dass ein Template alleine, wenn es nicht benoetigt wird, noch gar keinen Code erzeugt. Also ich ging immer davon aus, dass Code erst erzeugt wird, wenn ich z. B. ein Objekt mit list<int> erzeuge oder eine Template-Funktion aufrufe.
So kenne ich das auch. Ich hab auch Zweifel, dass jede Instanz einer Liste 17kb braucht. Weil der Code wird nur ein mal uebernommen - egal ob Du eine oder 200 Instanzen hat. Nur die Daten kommen so haeufig vor, wie Du Instanzen hast. Aber das eine leere Liste 17kb an Daten braucht, kann ich nicht glaube. Ist mir aber auch nicht so wichtig, dass ich das nun ausprobieren wuerde. Wenn es so ist, ist es so und wenn nicht, dann hat die CT halt Bloedsinn erzaehlt - mir beides egal (-; Wenn Du es wirklich genau wissen willst, dann frag in obiger Newsgroup. Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ 3 4 "A button I have made must be pushed." (ip)
Hallo, On Sat, 17 May 2003 at 15:01 (+0200), Bodo Kaelberer wrote:
hab gerade die aktuelle c't bekommen und mir den Artikel Generische Programmierung durchgelesen, wo es auch um C++ Templates geht. Was ich nicht verstehe ist folgendes
[...] Die direkte Konsequenz daraus ist, dass Templates keine uebersetzbaren Einheiten sind. Die Implementierungen von Template- Methoden muessen in den Header-Dateien untergebracht werden. Bei der STL bedeutet beispielsweise allein das Einfuegen der Praeprozessor- Direktive #include
unter Linux eine Vergroesserung der Objektdatei um 36 kByte. Jede neue Instanz von list kostet weitere 17 kByte. [...] Mal abgesehen davon dass ich eine Header-Datei
noch nie benoetigt habe (ich hab einfach immer <list>, ... verwendet), dachte ich bisher, dass ein Template alleine, wenn es nicht benoetigt wird, noch gar keinen Code erzeugt. Also ich ging immer davon aus, dass Code erst erzeugt wird, wenn ich z. B. ein Objekt mit list<int> erzeuge oder eine Template-Funktion aufrufe. So kenne ich das auch. Ich hab auch Zweifel, dass jede Instanz einer Liste 17kb braucht. Weil der Code wird nur ein mal uebernommen - egal ob Du eine oder 200 Instanzen hat. Nur die Daten kommen so haeufig vor, wie Du Instanzen hast. Aber das eine leere Liste 17kb an Daten braucht, kann ich nicht glaube.
Nicht jede Instanz, sondern jeder Listentyp, also 17 kB fuer list<int>, weitere 17 kB fuer list<char> etc. Nur dass durch die Inkludierung einer Header-Datei schon Speicher gebraucht wird kann ich nicht glauben.
Wenn Du es wirklich genau wissen willst, dann frag in obiger Newsgroup.
Gar keine so schlechte Idee. Werde ich tun. Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ "Zivilcourage ist das, was von einem Menschen übrig bleibt, wenn der Vorgesetzte das Zimmer betritt." -- Wernher von Braun
Hallo, On Sat, 17 May 2003, Bernhard Walle wrote: [..]
Nicht jede Instanz, sondern jeder Listentyp, also 17 kB fuer list<int>, weitere 17 kB fuer list<char> etc. Nur dass durch die Inkludierung einer Header-Datei schon Speicher gebraucht wird kann ich nicht glauben.
Was spricht gegen's Ausprobieren? (Code ganz unten) $ for j in `seq 0 3`; do \ g++ -Os -Wall -W -ansi -pedantic -DUSE_LIST=$j -o listtest listtest.cc; \ strip listtest; ls -l listtest; ./listtest; \ done -rwxr-xr-x 1 dh dh 3648 May 17 16:27 listtest Hallo Welt! -rwxr-xr-x 1 dh dh 7460 May 17 16:27 listtest Hallo Welt! charlist: 1 2 3 -rwxr-xr-x 1 dh dh 8932 May 17 16:27 listtest Hallo Welt! charlist: 2 4 6 shortlist: 4 12 8 -rwxr-xr-x 1 dh dh 10404 May 17 16:27 listtest Hallo Welt! charlist: 3 6 9 shortlist: 6 18 12 intlist: 12 36 24 Das mit 17kB ist also Unfug -- zumindest wenn man g++ und die SGI STL verwendet, bei M$ Visual C++ mag das anders aussehen ;-P Achso: -Os vs. -O2 (plus -march= u.a.) macht keinen signifikanten Unterschied: 3648, 7492, 8968, 10536... -dnh ==== listtest.cc ==== #include <iostream> #if USE_LIST > 0 #include <list> #endif int main(void) { std::cout << "Hallo Welt!" << std::endl; #if USE_LIST > 0 int s; std::list<char> charlist; s = sizeof(char); charlist.push_back(USE_LIST*s*1); charlist.push_back(USE_LIST*s*2); charlist.push_back(USE_LIST*s*3); std::cout << "charlist: "; std::copy(charlist.begin(), charlist.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; #endif #if USE_LIST > 1 std::list<short> shortlist; s = sizeof(short); shortlist.push_back(USE_LIST*s*1); shortlist.push_back(USE_LIST*s*3); shortlist.push_back(USE_LIST*s*2); std::cout << "shortlist: "; std::copy(shortlist.begin(), shortlist.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; #endif #if USE_LIST > 2 std::list<int> intlist; s = sizeof(int); intlist.push_back(USE_LIST*s*1); intlist.push_back(USE_LIST*s*3); intlist.push_back(USE_LIST*s*2); std::cout << "intlist: "; std::copy(intlist.begin(), intlist.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; #endif return 0; } ==== -- They tell me that you're going to try posting to Alt.Sysadmin.Recovery. It's a Magnificent Idea; A Daring and Splendid Idea! It will be FUN! Assuming you're not vaporized, dissected, or otherwise killed in an assortment of supremely horrible and painful ways! Exciting, Isn't It?! -- grabbed off of Earl Grey, just there
On Sat, 17 May 2003 at 16:32 (+0200), David Haller wrote:
On Sat, 17 May 2003, Bernhard Walle wrote: [..]
Nicht jede Instanz, sondern jeder Listentyp, also 17 kB fuer list<int>, weitere 17 kB fuer list<char> etc. Nur dass durch die Inkludierung einer Header-Datei schon Speicher gebraucht wird kann ich nicht glauben.
Was spricht gegen's Ausprobieren? (Code ganz unten)
Es geht mir nicht darum ob das nun 17 kB oder 5 kB oder sonst viele
Bytes sind, das ist voellig egal. Mir ging es nur darum, dass durch
Inkludierung einer (Template-)Header-Datei ein Bit mehr Code erzeugt
wird. Und das ist offensichtlich der Fall.
Siehe
http://groups.google.de/groups?hl=de&lr=&ie=UTF-8&threadm=slrnbccdg9.e9p.Bernhard.Walle%40news.bwalle.de&rnum=1&prev=/groups%3Fq%3Dtemplate%2Bwalle%26hl%3Dde%26lr%3D%26ie%3DUTF-8%26selm%3Dslrnbccdg9.e9p.Bernhard.Walle%2540news.bwalle.de%26rnum%3D1
Dass mit jeder weiteren list<>-Klasse weiterer Code erzeugt wird ist
klar. Allerdings haben die von der c't ja auch
participants (3)
-
Bernhard Walle
-
Bodo Kaelberer
-
David Haller