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 

sizeof von abgeleiteten Objekten

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Ernst Murnleitner
Guest





PostPosted: Sat Mar 25, 2006 6:31 pm    Post subject: sizeof von abgeleiteten Objekten Reply with quote



Hallo,

ich habe eine Liste (std::list) mit Smart-Pointern
(boost::intrusive_ptr) auf die Basisklasse. Die abgeleiten Objekte haben
unterschiedliche Groesse. Wie kann ich nun die Größe der einzelnen
Objekte abfragen? (Um den Speicherbedarf der ganzen Liste buchzuführen).

Was sicher funktioniert ist, bei jeder Klasse in der Hierarchie eine
Memeber-Funktion Size() einzuführen:

Klasse::Size()
{
return sizeof(*this);
}


Ist das die einzige Möglichkeit?
sizeof(BasisklasseZeiger) liefert 4
sizeof(* BasisklasseZeiger) liefert die Größe der Basisklasse aber nicht
vom tatsächlichen Objekt, auf das der Zeiger zeigt.
sizeof(*Intrusiveptr) liefert 12


Gruss++
Ernst

--
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
Marcel Müller
Guest





PostPosted: Sun Mar 26, 2006 1:06 am    Post subject: Re: sizeof von abgeleiteten Objekten Reply with quote



Hallo,

Ernst Murnleitner schrieb:
Quote:
ich habe eine Liste (std::list) mit Smart-Pointern
(boost::intrusive_ptr) auf die Basisklasse. Die abgeleiten Objekte haben
unterschiedliche Groesse. Wie kann ich nun die Größe der einzelnen
Objekte abfragen? (Um den Speicherbedarf der ganzen Liste buchzuführen).

[...]

Quote:
Ist das die einzige Möglichkeit?

Nein.

Sowas macht man, in dem man einen eigenen Allocator verwendet, der über
die Allozierungen Buch führt. Inwieweit boost::intrusive_ptr da
mitspielt, weiß ich nicht. Den habe ich noch nicht verwendet.
Aber die Standard-Container können es auf alle Fälle.


Marcel

--
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
Ernst Murnleitner
Guest





PostPosted: Sun Mar 26, 2006 1:06 am    Post subject: Re: sizeof von abgeleiteten Objekten Reply with quote



Ernst Murnleitner schrieb:
Quote:

Klasse::Size()

size_t Klasse::Size() wäre damit gemeint.

--
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: Sun Mar 26, 2006 10:06 am    Post subject: Re: sizeof von abgeleiteten Objekten Reply with quote

Ernst Murnleitner wrote:
Quote:
Was sicher funktioniert ist, bei jeder Klasse in der Hierarchie eine
Memeber-Funktion Size() einzuführen:

Klasse::Size()
{
return sizeof(*this);
}

Ist das die einzige Möglichkeit?

Die einzige portable.

sizeof() liefert unter C++ grundsätzlich eine Compilezeit-Konstante, der
Ausdruck in Klammern wird nie ausgewertet. Darauf basieren ja all die
Template-Spielereien wie 'is_derived_from' usw.

Eine weniger intrusive Variante wäre
std::map<std::typeinfo, std::size_t> sizes;
// ...
sizes[typeid(Klasse1)] = sizeof(Klasse1);
sizes[typeid(Klasse2)] = sizeof(Klasse2);
sizes[typeid(Klasse3)] = sizeof(Klasse3);
// ...
total_size = 0;
for (std::list<Base*>::iterator i = l.begin(); i != l.end(); ++i)
total_size += sizes[typeid(**i)];
Diese Variante würde ich in Betracht ziehen, wenn ich die Funktion nur
zum Debugging bräuchte. Die Initialisierung der map lässt sich bequem
z.B. per Perlscript generieren.

Ansonsten gebe ich zu bedenken, dass die Größe einer Klasseninstanz
selten den belegten Speicher angibt. sizeof(std::string) ist auch immer
konstant (z.B. 4 oder Cool, egal, wie lang der String ist. Daher wäre eine
Methode 'Size()' vielleicht gar nicht verkehrt, da sie solche Größen mit
einbeziehen könnte. Weiterhin runden gängige Allokatoren, so dass eine
Klasse mit sizeof(X)==1 z.B. mindestens 16 Bytes belegt.


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
Rolf Magnus
Guest





PostPosted: Sun Mar 26, 2006 12:06 pm    Post subject: Re: sizeof von abgeleiteten Objekten Reply with quote

Stefan Reuther wrote:

Quote:
Ansonsten gebe ich zu bedenken, dass die Größe einer Klasseninstanz
selten den belegten Speicher angibt. sizeof(std::string) ist auch immer
konstant (z.B. 4 oder Cool, egal, wie lang der String ist. Daher wäre eine
Methode 'Size()' vielleicht gar nicht verkehrt, da sie solche Größen mit
einbeziehen könnte. Weiterhin runden gängige Allokatoren, so dass eine
Klasse mit sizeof(X)==1 z.B. mindestens 16 Bytes belegt.

Außerdem gibt's bei dynamischem Speicher noch den Overhead des
Speichermanagements.

--
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
Page 1 of 1

 
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.