 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Ernst Murnleitner Guest
|
Posted: Sat Mar 25, 2006 6:31 pm Post subject: sizeof von abgeleiteten Objekten |
|
|
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
|
Posted: Sun Mar 26, 2006 1:06 am Post subject: Re: sizeof von abgeleiteten Objekten |
|
|
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
|
Posted: Sun Mar 26, 2006 1:06 am Post subject: Re: sizeof von abgeleiteten Objekten |
|
|
Ernst Murnleitner schrieb:
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
|
Posted: Sun Mar 26, 2006 10:06 am Post subject: Re: sizeof von abgeleiteten Objekten |
|
|
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 , 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
|
Posted: Sun Mar 26, 2006 12:06 pm Post subject: Re: sizeof von abgeleiteten Objekten |
|
|
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 , 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 |
|
 |
|
|
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
|
|