 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Oliver Schneidewind Guest
|
Posted: Mon Feb 14, 2005 6:50 pm Post subject: Returnwert von sizeof(Klasse) |
|
|
Hallo
Eigentlich Porgrammiere ich in C und dort liefert sizeof(struct) die
gesammt grosse Aller Elemente.Aber was darf ich bei ISO C++ erwarten,
wenn ich sizeof(class) mache? Auch nur die Summe der grosse von den
einzelen Variablen oder werden auch irgendwie die Methoden und ggf.
Methoden Variablen mit berechnet?
mfg
Oliver
--
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 |
|
 |
Albrecht Fritzsche Guest
|
Posted: Tue Feb 15, 2005 8:34 am Post subject: Re: Returnwert von sizeof(Klasse) |
|
|
Oliver Schneidewind wrote:
| Quote: |
Hallo
Eigentlich Porgrammiere ich in C und dort liefert sizeof(struct) die
gesammt grosse Aller Elemente.Aber was darf ich bei ISO C++ erwarten
|
Etwas mehr ;-)
| Quote: | wenn ich sizeof(class) mache? Auch nur die Summe der grosse von den
einzelen Variablen oder werden auch irgendwie die Methoden und ggf.
Methoden Variablen mit berechnet?
|
Yeaph - vtable Pointer, Padding... Insgesamt halt die Groesse, die
das/ein Objekt im Speicher verbraucht. Dies kann also aus obigen
Gruenden mehr sein, als die Summe der einzelnen Teile.
ZB habe beide structs (bei normalen Padding) unterschiedliche Groesse
struct Base_01 {
int a_;
~Base_01(){}
};
struct Base_02 {
int a_;
virtual ~Base_02(){}
};
int main()
{
cout << sizeof(Base_01) << endl;
cout << sizeof(Base_02) << endl;
return 0;
}
Ali
--
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 |
|
 |
Tibor Pausz Guest
|
Posted: Tue Feb 15, 2005 8:47 am Post subject: Re: Returnwert von sizeof(Klasse) |
|
|
Oliver Schneidewind <oliver (AT) 2becrazy (DOT) de> wrote:
| Quote: | Eigentlich Porgrammiere ich in C und dort liefert sizeof(struct) die
gesammt grosse Aller Elemente.
|
Nein, das ist nur dann der Fall, wenn es kein Padding gibt. Wenn es
Padding gibt, dann ist die Größe des structs größer als die Summe seiner
Teile; gleiches gilt für C++.
| Quote: | Aber was darf ich bei ISO C++ erwarten, wenn ich sizeof(class) mache?
|
Das hängt davon ab, was für eine Klasse das ist. Unter Umständen kommt
eine Zeiger auf die "Klassenbeschreibung" dazu.
--
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: Tue Feb 15, 2005 9:05 am Post subject: Re: Returnwert von sizeof(Klasse) |
|
|
Oliver Schneidewind wrote:
| Quote: | Eigentlich Porgrammiere ich in C und dort liefert sizeof(struct) die
gesammt grosse Aller Elemente.Aber was darf ich bei ISO C++ erwarten,
wenn ich sizeof(class) mache? Auch nur die Summe der grosse von den
einzelen Variablen oder werden auch irgendwie die Methoden und ggf.
Methoden Variablen mit berechnet?
|
Sobald die Klasse mindestens eine virtuelle Funktion oder Basisklasse
mit einer solchen hat mehr. Strukturen ohne virtuelle Funktionen
verhalten sich aus Kompatibilitätsgründen wie in C.
Wenn man Pech hat ist der sizeof-Operator auch noch überladen, und man
bekommt etwas implementationsspezifisches zurück.
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 |
|
 |
Edzard Egberts Guest
|
Posted: Tue Feb 15, 2005 10:59 am Post subject: Re: Returnwert von sizeof(Klasse) |
|
|
| Quote: | Eigentlich Porgrammiere ich in C und dort liefert sizeof(struct) die
gesammt grosse Aller Elemente.Aber was darf ich bei ISO C++ erwarten,
wenn ich sizeof(class) mache? Auch nur die Summe der grosse von den
einzelen Variablen oder werden auch irgendwie die Methoden und ggf.
Methoden Variablen mit berechnet?
|
Auf vernünftige Angaben für sizeof kannst Du Dich eigentlich nur bei
"POD", also grundlegenden Typen wie int verlassen.
Eine einfache Klasse mit einem Element funktioniert noch zuverlässig,
bei zwei Elementen kann die Größe aber schon von der Datenausrichtung
abhängen, die ja größer als Byte sein kann. Wenn das Element ein Zeiger
ist, erhältst Du nur die Zeigergröße und nicht die Größe der dynamischen
Daten. Eine virtuelle Klasse hat auf jeden Fall noch den zusätzlichen
Zeiger auf die vtable, ist also mindestens 4 Byte groß (auch ohne
weitere Daten).
sizeof(class) wird ja meistens bei der Serialisierung gebraucht, um die
Datengröße zu ermitteln. Ich schreibe die Daten dazu immer zuerst auf
einen Streambuf (der keinen Speicher anfordert) zur Größenermittlung,
bevor dann "ernsthaft" gestreamt wird. ;o)
Gruß,
Ed
--
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: Tue Feb 15, 2005 11:09 am Post subject: Re: Returnwert von sizeof(Klasse) |
|
|
Tibor Pausz wrote:
| Quote: | Oliver Schneidewind <oliver (AT) 2becrazy (DOT) de> wrote:
Eigentlich Porgrammiere ich in C und dort liefert sizeof(struct) die
gesammt grosse Aller Elemente.
Nein, das ist nur dann der Fall, wenn es kein Padding gibt. Wenn es
Padding gibt, dann ist die Größe des structs größer als die Summe seiner
Teile; gleiches gilt für C++.
Aber was darf ich bei ISO C++ erwarten, wenn ich sizeof(class) mache?
Das hängt davon ab, was für eine Klasse das ist. Unter Umständen kommt
eine Zeiger auf die "Klassenbeschreibung" dazu.
|
Prinzipiell ist in ISO-C++ nicht weiter spezifiziert, was da genau
dazukommt. Weiterhin besteht zwischen structs und Klassen in C++ in dieser
Hinsicht überhaupt kein Unterschied.
--
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: Tue Feb 15, 2005 11:22 am Post subject: Re: Returnwert von sizeof(Klasse) |
|
|
"Rolf Magnus" <ramagnus (AT) t-online (DOT) de> schrieb im Newsbeitrag
news:cusl8q$r34$03$1 (AT) news (DOT) t-online.com...
| Quote: | Tibor Pausz wrote:
Oliver Schneidewind <oliver (AT) 2becrazy (DOT) de> wrote:
Eigentlich Porgrammiere ich in C und dort liefert sizeof(struct) die
gesammt grosse Aller Elemente.
Nein, das ist nur dann der Fall, wenn es kein Padding gibt. Wenn es
Padding gibt, dann ist die Größe des structs größer als die Summe seiner
Teile; gleiches gilt für C++.
Aber was darf ich bei ISO C++ erwarten, wenn ich sizeof(class) mache?
Das hängt davon ab, was für eine Klasse das ist. Unter Umständen kommt
eine Zeiger auf die "Klassenbeschreibung" dazu.
Prinzipiell ist in ISO-C++ nicht weiter spezifiziert, was da genau
dazukommt. Weiterhin besteht zwischen structs und Klassen in C++ in dieser
Hinsicht überhaupt kein Unterschied.
|
Man kann, theoretisch, in C++ sogar dem Compiler helfen, padding etc. zu
reduzieren:
struct Inefficient
{
char a;
std::vector<int> vec;
long double ld;
std::list<double> list;
char c;
double d;
std::string str;
int a;
};
im Gegensatz zu:
struct PotentiallyEfficient
{
public: char a;
public: std::vector<int> vec;
public: long double ld;
public: std::list<double> list;
public: char c;
public: double d;
public: std::string str;
public: int a;
};
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 |
|
 |
Tibor Pausz Guest
|
Posted: Tue Feb 15, 2005 12:26 pm Post subject: Re: Returnwert von sizeof(Klasse) |
|
|
Beides ist äquivalent was nützt es vor jedem Member extra ein public zu
schreiben?
--
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 |
|
 |
Jan Boehme Guest
|
Posted: Tue Feb 15, 2005 12:53 pm Post subject: Re: Returnwert von sizeof(Klasse) |
|
|
Thomas Mang wrote:
| Quote: | Man kann, theoretisch, in C++ sogar dem Compiler helfen, padding etc. zu
reduzieren:
struct Inefficient
{
char a;
std::vector<int> vec;
long double ld;
std::list<double> list;
char c;
double d;
std::string str;
int a;
};
im Gegensatz zu:
struct PotentiallyEfficient
{
public: char a;
public: std::vector<int> vec;
public: long double ld;
public: std::list<double> list;
public: char c;
public: double d;
public: std::string str;
public: int a;
};
Thomas
|
Hallo Thomas!
Kannst Du kurz ausführen, worin der Unterschied für den Compiler besteht
und was das Resultat ist?
Danke. Grüße, Jan.
--
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: Tue Feb 15, 2005 1:18 pm Post subject: Re: Returnwert von sizeof(Klasse) |
|
|
Tibor Pausz wrote:
| Quote: | Beides ist äquivalent was nützt es vor jedem Member extra ein public zu
schreiben?
|
Das gibt dem Compiler im Prinzip das Recht, die Member im Speicher
umzusortieren und daher mit weniger Padding auszukommen (§ 9.2/12).
Ich weiß aber nicht, welcher Compiler das tatsächlich ausnützt -
mein gcc jedenfalls nicht.
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 |
|
 |
Thomas Mang Guest
|
Posted: Tue Feb 15, 2005 2:15 pm Post subject: Re: Returnwert von sizeof(Klasse) |
|
|
"Jan Boehme" <aiscape (AT) hotmail (DOT) com> schrieb im Newsbeitrag
news:37e9lvF56qc30U1 (AT) individual (DOT) net...
| Quote: | Thomas Mang wrote:
Man kann, theoretisch, in C++ sogar dem Compiler helfen, padding etc. zu
reduzieren:
struct Inefficient
{
char a;
std::vector<int> vec;
long double ld;
std::list<double> list;
char c;
double d;
std::string str;
int a;
};
im Gegensatz zu:
struct PotentiallyEfficient
{
public: char a;
public: std::vector<int> vec;
public: long double ld;
public: std::list<double> list;
public: char c;
public: double d;
public: std::string str;
public: int a;
};
Thomas
Hallo Thomas!
Kannst Du kurz ausführen, worin der Unterschied für den Compiler besteht
und was das Resultat ist?
|
Der Compiler fasst alle member zwischen access-specifiern (public,
protected, private) zu einer Gruppe zusammen, die im Speicher so seriell mit
aufsteigender Adresse angeordnet werden müssen (erstes member -> niedrigere
Adresse). Wie diese Gruppen aber zueindander stehen, ist nicht
spezifiziert - also eine Gruppe kann, obwohl nach einer anderen deklariert,
im Speicherlayout durchaus davor stehen.
Bei Inefficient kommt, weil alle member in einer Gruppe sind, immer zuerst
a, dann vec, dann ld, dann list usw; daran darf auch nichts geändert werden.
Bei PotentiallyEfficient darf der Compiler alle member umsortieren, wie es
im paßt, da alle jeweils eine eigene Gruppe bilden. Das heißt, der kann z.B.
die beiden char a und c hintereinander anlegen, dann vielleicht
vec/list/string, falls die auf 4-byte Grenzen ausgerichtet werden, und
zuletzt double / long double. Der Compiler kennt die effizienteste Anordnung
von membern gemäß derem alignment - wir kennen sie nicht - und kann somit
Platz sparen.
Folgende Struktur:
struct A
{
char a;
double b;
char c;
};
Sagen wir, auf einer Maschine wird char auf 1-byte Grenzen ausgerichtet, und
double auf 8-byte Grenzen. Bei meinem GCC ergibt sich somit sizeof(A) ==
24. Ändert man die member so um:
struct A
{
char a;
char c;
double b;
};
ist sizeof(A) == 16.
Der Clou mit dem access-specifier pro member besteht nun darin, daß wir
generell nicht wissen, welches alignment welche member brauchen. Bei
built-in hilft die Doku weiter, aber wenn man typedefs hat, oder UDTs, steht
man üblicherweise im Regen, ob Objekte dieser Klasse auf z.b. 1-byte
Grenzen, oder 16-byte Grenzen ausgerichtet werden.
Laß mich erwähnen, ich weiß nicht ob ein Compiler das tatsächlich ausnutzt.
Andererseits kann man ja für die Zukunft hoffen :-)
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 |
|
 |
Kurt Stege Guest
|
Posted: Tue Feb 15, 2005 2:35 pm Post subject: Re: Returnwert von sizeof(Klasse) |
|
|
On Mon, 14 Feb 2005 19:50:51 +0100, Oliver Schneidewind <oliver (AT) 2becrazy (DOT) de>
wrote:
| Quote: | Eigentlich Porgrammiere ich in C und dort liefert sizeof(struct) die
gesammt grosse Aller Elemente.Aber was darf ich bei ISO C++ erwarten,
wenn ich sizeof(class) mache? Auch nur die Summe der grosse von den
einzelen Variablen oder werden auch irgendwie die Methoden und ggf.
Methoden Variablen mit berechnet?
|
sizeof(class foo) bestimmt _nicht_ die Größe der Klasse (was auch
immer das sein mag), sondern die Größe eines einzelnen Objektes
dieser Klasse. Deine Frage nach "auch irgendwie die Methoden"
interpretiere ich mal als die Frage nach der Größe des Programmcodes,
um diese Methoden zu implementieren. Dieser Code wird nur einmal
für die gesamte Klasse gebraucht und nicht für jedes Objekt neu,
und zählen deshalb ganz bestimmt nicht bei sizeof(class foo) mit.
HTH,
Kurt.
--
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 |
|
 |
no spam Guest
|
Posted: Sat Feb 19, 2005 10:14 pm Post subject: Re: Returnwert von sizeof(Klasse) |
|
|
Falk Tannhäuser wrote:
| Quote: | Das gibt dem Compiler im Prinzip das Recht, die Member im Speicher
umzusortieren und daher mit weniger Padding auszukommen (§ 9.2/12).
Ich weiß aber nicht, welcher Compiler das tatsächlich ausnützt -
mein gcc jedenfalls nicht.
|
Aber, wenn er das umsortieren darf, welche Kriterien hat er denn für
eine Änderung der Reihenfolge bzw. wie wirkt sich so eine Änderung der
Reihenfolge durch den Compiler auf die Initialisierungsreihenfolge aus?
--
Georg Maaß - bioshop.de D-76227 Karlsruhe, Westmarkstraße 82
HTML, XML / JavaScript, C++, Java, PHP, VB / CGI, JSP, ASP, ASP.net
- The ultimate DHTML engine: http://gml-modul.de -
live at: http://gml-modul.dyndns.org
--
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: Sun Feb 20, 2005 9:03 am Post subject: Re: Returnwert von sizeof(Klasse) |
|
|
"no spam" <georg (AT) bioshop (DOT) de> schrieb im Newsbeitrag
news:4217ba0c$0$13220$9b4e6d93 (AT) newsread4 (DOT) arcor-online.net...
| Quote: | Falk Tannhäuser wrote:
Das gibt dem Compiler im Prinzip das Recht, die Member im Speicher
umzusortieren und daher mit weniger Padding auszukommen (§ 9.2/12).
Ich weiß aber nicht, welcher Compiler das tatsächlich ausnützt -
mein gcc jedenfalls nicht.
Aber, wenn er das umsortieren darf, welche Kriterien hat er denn für
eine Änderung der Reihenfolge bzw. wie wirkt sich so eine Änderung der
Reihenfolge durch den Compiler auf die Initialisierungsreihenfolge aus?
|
Die Kriterien kann sich der Compiler selber aussuchen. Ihm ist prinzipiell
alles freigestellt.
Auf die Initialisierungsreihenfolge wirkt sich das gar nicht aus, die bleibt
ganz normal - was zuerst deklariert wurde (innerhalb der Klassendefinition)
wird auch zuerst initialisiert.
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 |
|
 |
Georg Maaß Guest
|
Posted: Sun Feb 20, 2005 11:30 am Post subject: Re: Returnwert von sizeof(Klasse) |
|
|
Thomas Mang wrote:
| Quote: | Die Kriterien kann sich der Compiler selber aussuchen. Ihm ist prinzipiell
alles freigestellt.
Auf die Initialisierungsreihenfolge wirkt sich das gar nicht aus, die bleibt
ganz normal - was zuerst deklariert wurde (innerhalb der Klassendefinition)
wird auch zuerst initialisiert.
|
Ok, das ist gut. Ich präzisiere dies nämlich grundsätzlich immer
explizit für jedes einzelne Element, weil ich nämlich öfter als mal
Umsortierungen unter dem Aspekt der Initialisierungsreihenfolge
vornehme, wo dann durch die jeweils explizite Nennung der Zugriffsrechte
es nicht mehr passieren kann, das es versehentlich in eine Gruppe mit
anderen Regeln verschoben wird. Auch wenn der Quelltext dann oft als
"Java-Stil" verschrien wird, so vermeidet die explizite Nennung in jedem
Einzelfall, ärgerliche Programmierfehler, wenn es Gründe gibt, die
Reihenfolge zu ändern.
Gruß, Georg
--
Georg Maaß - bioshop.de D-76227 Karlsruhe, Westmarkstraße 82
HTML, XML / JavaScript, C++, Java, PHP, VB / CGI, JSP, ASP, ASP.net
- The ultimate DHTML engine: http://gml-modul.de -
live at: http://gml-modul.dyndns.org
--
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
|
|