 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Martin Kaul Guest
|
Posted: Fri Oct 29, 2004 9:56 am Post subject: Templates & Codegroesse |
|
|
Hallole,
ich geize gerade mit der Codegröße von meiner Embedded Applikation rum.
Ich verwende gcc und überlege gerade, ob ich die STL einsetzen kann.
Allen möglichen Kruscht den ich nicht brauche (Exceptions, RTTI usw) und
der mir meine Codegröße nur aufbläht habe ich inzwischen aus der STL vom
gcc rausgeschmissen.
Jetzt bin ich an den Templates der Standardbibliothek dran - meine
Überlegung ist die, dass ich eigentlich (z.B. bei Container) nur mit
Pointer als Templateargument arbeite (z.B. std::list<int*>,
std::list<float*> usw).
Jetzt legt er bisher für jede verwendete Variante der Liste einen
eigenen Code an (und vergrößert damit mein Programm), obwohl er
eigentlich immer nur Pointer verwaltet.
Gibt es ne Möglichkeit (vorzugsweise ne C++ Standardkonforme), dass der
Compiler nur einmal z.B. die std::list mit "void *" anlegt und alle
anderen Varianten der std::list mit Pointers als Templateargument intern
dann den Code der std::list<void*> Variante nimmt?
tschaule
Martin
--
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 |
|
 |
Markus Schaaf Guest
|
Posted: Fri Oct 29, 2004 12:23 pm Post subject: Re: Templates & Codegroesse |
|
|
"Martin Kaul" <mkaul (AT) leuze (DOT) de> schrieb:
| Quote: | Gibt es ne Möglichkeit (vorzugsweise ne C++ Standardkonforme), dass der
Compiler nur einmal z.B. die std::list mit "void *" anlegt und alle
anderen Varianten der std::list mit Pointers als Templateargument intern
dann den Code der std::list<void*> Variante nimmt?
|
Eigenes Template, von der »void*«-Variante ableiten und die Casts an
den passenden Stellen drankleben. Ich sehe aber nicht, daß das besser
wäre, als direkt eigene Container zu schreiben. Außerdem verlierst
du mit einer Liste von Zeigern ja wieder mächtig Speicher im
Datenbereich. Ob's das bringt? Vielleicht wäre der "intrusive" Ansatz
von Olaf für Dich geeigneter?
Außerdem sehe ich nicht, wie Du die Standard-Lib benutzen willst,
ohne Exceptions. Die Container sind nicht darauf vorbereitet, daß die
Allokation Null-Zeiger liefert.
--
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 |
|
 |
Martin Kaul Guest
|
Posted: Fri Oct 29, 2004 12:53 pm Post subject: Re: Templates & Codegroesse |
|
|
Markus Schaaf wrote:
| Quote: | Eigenes Template, von der »void*«-Variante ableiten und die Casts an
den passenden Stellen drankleben. Ich sehe aber nicht, daß das besser
wäre, als direkt eigene Container zu schreiben.
hmm, wäre ne Idee - muss ich mir mal anschauen, wie aufwendig das ist. |
Ich habe gehofft, dass es irgend eine automatische Möglichkeit gibt...
| Quote: | Außerdem verlierst
du mit einer Liste von Zeigern ja wieder mächtig Speicher im
Datenbereich.
Die Liste war ja nur ein Beispiel für die anderen vielen Templates der STL. |
| Quote: | Ob's das bringt? Vielleicht wäre der "intrusive" Ansatz
von Olaf für Dich geeigneter?
?? kannst du mir nen Link geben... - "intrusive" Ansatz sagt mir im |
Augenblick nichts.
| Quote: |
Außerdem sehe ich nicht, wie Du die Standard-Lib benutzen willst,
ohne Exceptions. Die Container sind nicht darauf vorbereitet, daß die
Allokation Null-Zeiger liefert.
Ich muss zur Laufzeit ein deterministisches Speicherverhalten |
sicherstellen, d.h. alle Objekte werden nur während der Initphase
erzeugt und ändern ihr Speicherverhalten zur Laufzeit nicht mehr.
Da unser System dann zur Laufzeit sowieso keine Dynamik hat, muss ich
nur sicherstellen, dass während der Initphase ein Alloc funktioniert -
mit ner eigenen Allokatorklasse (welche eine Diagnose-Fehlermeldung beim
Fehlschlag ausgibt) geht das - später zur Laufzeit verweigert die
Allokatorklasse dann jegliche Speicheranforderung (gibt auch wieder ne
Fehlermeldung).
Das bedeutet für Container natuerlich, dass auch zur Laufzeit nichts
mehr in den Container reingeschrieben wird - bin mal gespannt, ob wir
das durchhalten können ;-)
tschaule
Martin
--
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 |
|
 |
Steffen Rauh Guest
|
Posted: Fri Oct 29, 2004 5:03 pm Post subject: Re: Templates & Codegroesse |
|
|
| Quote: | Gibt es ne Möglichkeit (vorzugsweise ne C++ Standardkonforme), dass der
Compiler nur einmal z.B. die std::list mit "void *" anlegt und alle
anderen Varianten der std::list mit Pointers als Templateargument intern
dann den Code der std::list<void*> Variante nimmt?
|
Stroustrup beschreibt in "Die C++ Programmiersprache" unter "13.5
Spezialisierung" genau dieses Problem und die dazugehörige Lösung.
MfG,
Steffen Rauh
--
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: Fri Oct 29, 2004 6:16 pm Post subject: Re: Templates & Codegroesse |
|
|
Martin Kaul wrote:
| Quote: | Da unser System dann zur Laufzeit sowieso keine Dynamik hat, muss ich
nur sicherstellen, dass während der Initphase ein Alloc funktioniert -
mit ner eigenen Allokatorklasse (welche eine Diagnose-Fehlermeldung beim
Fehlschlag ausgibt) geht das - später zur Laufzeit verweigert die
Allokatorklasse dann jegliche Speicheranforderung (gibt auch wieder ne
Fehlermeldung).
Das bedeutet für Container natuerlich, dass auch zur Laufzeit nichts
mehr in den Container reingeschrieben wird - bin mal gespannt, ob wir
das durchhalten können
|
Ich kenn natürlich deine Anwendung nicht. Aber bei diesen Anforderungen
wäre es vielleicht gar nicht mal so abwegig, sich auf einen einzigen
Container zu beschränken ("vector"), und den kann man dann beliebig
effizient implementieren.
template<typename T, size_t N>
class vector {
T elems[N];
};
Was bringt eine Liste, wenn man nicht anfügen/löschen darf? Was bringt
eine map, wenn binäre Suche auf einem vector<pair genauso schnell
ist?
Ich hab jedenfalls für meinen performancekritischen embedded-Code nur
normale Arrays verwendet, und bin eigentlich nicht der Meinung, dass der
dadurch uneleganter wird. Ich pack allerdings nur int16_t und int32_t in
meine Arrays :)
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 |
|
 |
Thomas Mang Guest
|
Posted: Fri Oct 29, 2004 7:55 pm Post subject: Re: Templates & Codegroesse |
|
|
"Martin Kaul" <mkaul (AT) leuze (DOT) de> schrieb im Newsbeitrag
news:41823d7a$0$298$4d4ebb8e (AT) read (DOT) news.de.uu.net...
| Quote: | Markus Schaaf wrote:
Eigenes Template, von der »void*«-Variante ableiten und die Casts an
den passenden Stellen drankleben. Ich sehe aber nicht, daß das besser
wäre, als direkt eigene Container zu schreiben.
hmm, wäre ne Idee - muss ich mir mal anschauen, wie aufwendig das ist.
Ich habe gehofft, dass es irgend eine automatische Möglichkeit gibt...
Außerdem verlierst
du mit einer Liste von Zeigern ja wieder mächtig Speicher im
Datenbereich.
Die Liste war ja nur ein Beispiel für die anderen vielen Templates der
STL.
Ob's das bringt? Vielleicht wäre der "intrusive" Ansatz
von Olaf für Dich geeigneter?
?? kannst du mir nen Link geben... - "intrusive" Ansatz sagt mir im
Augenblick nichts.
Außerdem sehe ich nicht, wie Du die Standard-Lib benutzen willst,
ohne Exceptions. Die Container sind nicht darauf vorbereitet, daß die
Allokation Null-Zeiger liefert.
Ich muss zur Laufzeit ein deterministisches Speicherverhalten
sicherstellen, d.h. alle Objekte werden nur während der Initphase
erzeugt und ändern ihr Speicherverhalten zur Laufzeit nicht mehr.
Da unser System dann zur Laufzeit sowieso keine Dynamik hat, muss ich
nur sicherstellen, dass während der Initphase ein Alloc funktioniert -
mit ner eigenen Allokatorklasse (welche eine Diagnose-Fehlermeldung beim
Fehlschlag ausgibt) geht das - später zur Laufzeit verweigert die
Allokatorklasse dann jegliche Speicheranforderung (gibt auch wieder ne
Fehlermeldung).
Das bedeutet für Container natuerlich, dass auch zur Laufzeit nichts
mehr in den Container reingeschrieben wird - bin mal gespannt, ob wir
das durchhalten können
|
Die extremste Lösung besteht wohl darin, einfach keine tollen Container zu
verwenden, sondern auf das zuzugreifen, was im Sprachkern drinnen ist - also
C-style arrays und dynamische arrays mit new[].
Da Du sowieso exceptions rausgeschmissen hast, keine Kopierbarkeit der
Container verlangst etc., ist diese Idee gar nicht mal so abwegig.
Das Problem beim code-bloat mit Containern kriegt man einigermaßen in den
Griff, indem man eine eigene Klasse schreibt, die nur das notwendigste macht
und wo alle Funktionen klein und inline sind (obwohl es meines Wissens nach
keine Möglichkeit gibt, festzulegen, daß eine Funktion wirklich inline
gemacht wird, also kein Code für die Funktion angelegt wird). So wird das
ganze etwas bequemer als ein blankes array, und die Kosten sollten sich sehr
in Grenzen halten (hängt aber logischerweise von der Codeerstellung deines
Compilers ab) - eventuell ist der overhead 0.
Noch eine Frage:
Hat es einen bestimmten Grund, daß Du pointer verwendest und nicht ints /
doubles per se? Schließlich benötigt die Verwendung von pointern und
heap-Objekten wieder zusätzlichen Speicher / Zeit.
Thomas
--
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 |
|
 |
Florian Weimer Guest
|
Posted: Fri Oct 29, 2004 8:29 pm Post subject: Re: Templates & Codegroesse |
|
|
* Martin Kaul:
| Quote: | Gibt es ne Möglichkeit (vorzugsweise ne C++ Standardkonforme), dass der
Compiler nur einmal z.B. die std::list mit "void *" anlegt und alle
anderen Varianten der std::list mit Pointers als Templateargument intern
dann den Code der std::list<void*> Variante nimmt?
|
Ja, das geht mit partieller Spezialisierung. Die GCC-Standardbibliothek
macht das allerdings noch nicht.
--
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: Fri Oct 29, 2004 10:37 pm Post subject: Re: Templates & Codegroesse |
|
|
Martin Kaul wrote:
| Quote: | Ob's das bringt? Vielleicht wäre der "intrusive" Ansatz
von Olaf für Dich geeigneter?
?? kannst du mir nen Link geben... - "intrusive" Ansatz sagt mir im
Augenblick nichts.
|
Ein intrusiver Container verlangt vom Elementtyp spezielle Unterstützung. So
könnte z.B. eine intrusive verkettete Liste fordern, daß seine Elemente von
einer bestimmten Klasse abgeleitet sind, die den Zeiger auf das nächste
Element enthält. Das ist nicht ganz so elegant wie ein nicht-intrusiver
Container (wie z.B. std::list), aber dafür ist es effizienter.
--
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 |
|
 |
Heiko Bauke Guest
|
Posted: Sat Oct 30, 2004 9:29 am Post subject: Re: Templates & Codegroesse |
|
|
Hi,
On Fri, 29 Oct 2004 19:03:22 +0200
"Steffen Rauh" <steffen.rauh (AT) gmx (DOT) de> wrote:
| Quote: | Gibt es ne Möglichkeit (vorzugsweise ne C++ Standardkonforme), dass
der Compiler nur einmal z.B. die std::list mit "void *" anlegt und
alle anderen Varianten der std::list mit Pointers als
Templateargument intern dann den Code der std::list<void*> Variante
nimmt?
Stroustrup beschreibt in "Die C++ Programmiersprache" unter "13.5
Spezialisierung" genau dieses Problem und die dazugehörige Lösung.
|
wenn ich mich recht entsinne, arbeitet LEDA auch so, siehe Anhang von
http://www.amazon.de/exec/obidos/ASIN/0521563291/qid%3D1099128528/302-7447180-9739258
Heiko
--
-- Mit einem kurzen Schweifwedeln kann ein Hund mehr Gefühl
-- ausdrücken, als mancher Mensch mit stundenlangem Gerede.
-- (Louis Armstrong, 1900-1971)
-- Heiko Bauke @ http://www.uni-magdeburg.de/bauke
--
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 |
|
 |
Markus Breuer Guest
|
Posted: Mon Nov 01, 2004 7:35 am Post subject: Re: Templates & Codegroesse |
|
|
| Quote: | Gibt es ne Möglichkeit (vorzugsweise ne C++ Standardkonforme), dass der
Compiler nur einmal z.B. die std::list mit "void *" anlegt und alle
anderen Varianten der std::list mit Pointers als Templateargument intern
dann den Code der std::list<void*> Variante nimmt?
|
Leite deine eigene Klasse von std::list<void*> ab. Damit erhälst du eine
verkettete Liste, die void* aufnehmen kann.
Nun leitest du diese Klasse für jeden von dir benötigten Typen ab und
überschreibt push_back/pop_front (was du halt benötigst) mit den
entsprechenden reinterpret_cast.
Sorge dafür, dass in den Headern kein inline-Code auftaucht (sonst hast
du wieder das Aufbläh-Problem) und implementiere die Funktionen
ausschliesslich in der Übersetzungseinheit.
Als Ergebnis befindet sich nun nur eine Implementation einer Liste in
deinem Code (std::list<void*>), durch weitere Ableitungen gibt es genau
einen reinterpret_cast je Member-Funktion. Der Linker wird nur jene
Methoden in dein Binary linken, die wirklich aufgerufen werden.
Anmerkung: Du darfst die Container nicht polymorph verwenden.
Gruß Markus
--
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 |
|
 |
Olaf Krzikalla Guest
|
Posted: Tue Nov 02, 2004 5:26 pm Post subject: Re: Templates & Codegroesse |
|
|
Hi,
Martin Kaul schrieb:
| Quote: | Ob's das bringt? Vielleicht wäre der "intrusive" Ansatz
von Olaf für Dich geeigneter?
?? kannst du mir nen Link geben... - "intrusive" Ansatz sagt mir im
Augenblick nichts.
|
http://people.freenet.de/turtle++/intrusive.html
Hth
Olaf Krzikalla
--
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 |
|
 |
volker_g Guest
|
Posted: Thu Nov 04, 2004 7:45 am Post subject: Re: Templates & Codegroesse |
|
|
Markus Breuer wrote:
| Quote: | Gibt es ne Möglichkeit (vorzugsweise ne C++ Standardkonforme),
dass der
Compiler nur einmal z.B. die std::list mit "void *" anlegt und alle
anderen Varianten der std::list mit Pointers als Templateargument
intern
dann den Code der std::list<void*> Variante nimmt?
Leite deine eigene Klasse von std::list<void*> ab. Damit erhälst du
eine
verkettete Liste, die void* aufnehmen kann.
Nun leitest du diese Klasse für jeden von dir benötigten Typen ab
und
überschreibt push_back/pop_front (was du halt benötigst) mit den
entsprechenden reinterpret_cast.
Sorge dafür, dass in den Headern kein inline-Code auftaucht (sonst
hast
du wieder das Aufbläh-Problem) und implementiere die Funktionen
ausschliesslich in der Übersetzungseinheit.
Als Ergebnis befindet sich nun nur eine Implementation einer Liste in
deinem Code (std::list<void*>), durch weitere Ableitungen gibt es
genau
einen reinterpret_cast je Member-Funktion. Der Linker wird nur jene
Methoden in dein Binary linken, die wirklich aufgerufen werden.
Anmerkung: Du darfst die Container nicht polymorph verwenden.
Gruß Markus
|
Hallo. Ich bin schon 'ne Weile 'raus aus der C++-Programmierung.
Wieso reinterpret_cast() und nicht static_cast()?
Gruß
Volker
--
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 |
|
 |
Falk Tannhäuser Guest
|
Posted: Thu Nov 04, 2004 10:34 am Post subject: Re: Templates & Codegroesse |
|
|
volker_g wrote:
| Quote: | Hallo. Ich bin schon 'ne Weile 'raus aus der C++-Programmierung.
Wieso reinterpret_cast() und nicht static_cast()?
|
Umwandlung von 'irgendein_Typ*' nach 'void*': implizit; static_cast
ist OK aber nicht nötig (außer evtl. für Auflösung überladener Funktionen);
reinterpret_cast nicht klar definiert, sollte aber praktisch nix anderes
als implizite Umwandlung oder static_cast ergeben
Umwandlung von 'void*' nach 'irgendein_Typ*': static_cast nötig und
hinreichend; reinterpret_cast - siehe oben
MfG
Falk
--
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 Nov 04, 2004 9:17 pm Post subject: Re: Templates & Codegroesse |
|
|
Martin Kaul wrote:
| Quote: | Stefan Reuther wrote:
Was bringt eine Liste, wenn man nicht anfügen/löschen darf? Was bringt
eine map, wenn binäre Suche auf einem vector<pair genauso schnell
ist?
Während der Starup Phase des Gerätes will ich die Container ganz normal
verwendet, d.h. alle SW-Teile bauen sich ihre Listen auf. Nur zur
Laufzeit darf sich nichts mehr ändern.
|
Ich kenne natürlich deine Anforderungen nicht, aber das widerspricht
meiner Aussage nicht wirklich. Wenn du z.B. jeden Vektor mit
vorgegebener Maximalgröße initialisierst, kannst du sicher eine Menge
sparen. Du müsstest dann eben ein eigenes vector-Template
implementieren, welches im Konstruktor einmal malloc aufruft und dessen
push_back-Methode eben fehlschlägt, wenn das Ding voll ist. Oder zum
Thema Listen: wenn du Listen durch Vektoren ersetzt, hast du keine
O(1)-Einfügeoperationen in der Mitte mehr, aber wenn die eh nur während
der Initialisierung auftreten, ist das verschmerzbar.
Die echten STL-Container kannst du leider nicht derart abspecken. Aber
einen Vektor wie den obigen zu implementieren ist eine einfache
Fleißarbeit von ein paar Stunden.
| Quote: | Ich hab jedenfalls für meinen performancekritischen embedded-Code nur
normale Arrays verwendet, und bin eigentlich nicht der Meinung, dass der
dadurch uneleganter wird. Ich pack allerdings nur int16_t und int32_t in
meine Arrays :)
Die STL und ihre Klassen finde ich erst mal gar nicht so unperformant.
Was mich hauptsächlich stört ist das aufblähen von Code durch Exceptions
und RTTI. Wir haben auf unserem System nur 256KByte Flash. Das Entfernen
von Exceptions und RTTI hat 16KByte Code eingespart. Wenn ich es jetzt
noch schaffe, dass nicht für jede Klasse ein eigener Container anglegt
wird, dann kann ich den Komfort der STL nutzen ohne meine Codegröße
allzustark zu strapazieren.
|
Das ist auch stark compilerabhängig. Selbst, wenn du einen vector<void*>
hast und vector<T*> das Ding nur wrappt
template<class T>
class vector<T*> {
vector<void*> rep;
public:
void* operator[](size_type i) const
{ return rep[i]; }
};
kannst du Pech haben, dass der Compiler das nicht wegoptimiert. Wenn es
wirklich kritisch wird greife ich an solchen Stellen auch mal zu C-Makros.
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 |
|
 |
Volker Glave Guest
|
Posted: Fri Nov 05, 2004 10:26 pm Post subject: Re: Templates & Codegroesse |
|
|
Falk Tannhäuser <falk.tannhauser (AT) crf (DOT) canon.fr> wrote
| Quote: | volker_g wrote:
Hallo. Ich bin schon 'ne Weile 'raus aus der C++-Programmierung.
Wieso reinterpret_cast() und nicht static_cast()?
Umwandlung von 'irgendein_Typ*' nach 'void*': implizit; static_cast
ist OK aber nicht nötig (außer evtl. für Auflösung überladener Funktionen);
reinterpret_cast nicht klar definiert, sollte aber praktisch nix anderes
als implizite Umwandlung oder static_cast ergeben
Umwandlung von 'void*' nach 'irgendein_Typ*': static_cast nötig und
hinreichend; reinterpret_cast - siehe oben
|
Du hast mich missverstanden. Ich wollte nicht den Unterschied
zwischen reinterpret_cast() und static_cast() wissen (den kenne
ich einigermaßen), sondern ich wollte wissen, warum Markus Breuer
in dem von ihm angerissenen Vorschlag ...
| Quote: | Leite deine eigene Klasse von std::list<void*> ab. Damit erhälst du eine
verkettete Liste, die void* aufnehmen kann.
Nun leitest du diese Klasse für jeden von dir benötigten Typen ab und
überschreibt push_back/pop_front (was du halt benötigst) mit den
entsprechenden reinterpret_cast.
Sorge dafür, dass in den Headern kein inline-Code auftaucht (sonst hast
du wieder das Aufbläh-Problem) und implementiere die Funktionen
ausschliesslich in der Übersetzungseinheit.
Als Ergebnis befindet sich nun nur eine Implementation einer Liste in
deinem Code (std::list<void*>), durch weitere Ableitungen gibt es genau
einen reinterpret_cast je Member-Funktion. Der Linker wird nur jene
Methoden in dein Binary linken, die wirklich aufgerufen werden.
Anmerkung: Du darfst die Container nicht polymorph verwenden.
|
.... meint, reinterpret_cast() einsetzen zu müssen, statt static_cast().
reinterpret_cast() beinhaltet ja im Gegensatz zu static_cast()
Laufzeitprüfung. Wozu ist die in dem Vorschlag nötig?
Gruß
Volker
--
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
|
|