C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Templates & Codegroesse
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Martin Kaul
Guest





PostPosted: Fri Oct 29, 2004 9:56 am    Post subject: Templates & Codegroesse Reply with quote



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





PostPosted: Fri Oct 29, 2004 12:23 pm    Post subject: Re: Templates & Codegroesse Reply with quote



"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





PostPosted: Fri Oct 29, 2004 12:53 pm    Post subject: Re: Templates & Codegroesse Reply with quote



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





PostPosted: Fri Oct 29, 2004 5:03 pm    Post subject: Re: Templates & Codegroesse Reply with quote

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





PostPosted: Fri Oct 29, 2004 6:16 pm    Post subject: Re: Templates & Codegroesse Reply with quote

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 Wink

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





PostPosted: Fri Oct 29, 2004 7:55 pm    Post subject: Re: Templates & Codegroesse Reply with quote


"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 Wink


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





PostPosted: Fri Oct 29, 2004 8:29 pm    Post subject: Re: Templates & Codegroesse Reply with quote

* 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





PostPosted: Fri Oct 29, 2004 10:37 pm    Post subject: Re: Templates & Codegroesse Reply with quote

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





PostPosted: Sat Oct 30, 2004 9:29 am    Post subject: Re: Templates & Codegroesse Reply with quote

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





PostPosted: Mon Nov 01, 2004 7:35 am    Post subject: Re: Templates & Codegroesse Reply with quote

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





PostPosted: Tue Nov 02, 2004 5:26 pm    Post subject: Re: Templates & Codegroesse Reply with quote

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





PostPosted: Thu Nov 04, 2004 7:45 am    Post subject: Re: Templates & Codegroesse Reply with quote

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





PostPosted: Thu Nov 04, 2004 10:34 am    Post subject: Re: Templates & Codegroesse Reply with quote

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





PostPosted: Thu Nov 04, 2004 9:17 pm    Post subject: Re: Templates & Codegroesse Reply with quote

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





PostPosted: Fri Nov 05, 2004 10:26 pm    Post subject: Re: Templates & Codegroesse Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.