PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit SizeOf


_Gast__
2006-09-20, 12:28:19
Hallo

mir ist aufgefallen das SizeOf nicht das anzeigt was ich erwartet habe. Das Problem tritt bei folgendem Code auf

#include <iostream.h>

class klasse1
{
int ganzzahl1;
int ganzzahl2;
};

class klasse2
{
int ganzzahl1;
int ganzzahl2;
int ganzzahl3;
double gleitkommazahl1;
};

int main()
{
klasse1 demo1;
klasse2 demo2;

cout << "SizeOf demo1 " << sizeof(demo1) << endl;
cout << "SizeOf demo2 " << sizeof(demo2) << endl;

return 0;
}


Die Ausgabe zeigt an das demo1 8 byte gross ist. Soweit ist alles klar ober es wird angezeigt das demo2 24 byte goss ist. Normalerweise müssten es doch 20 bytes sein (3x4bytes für int und 8 bytes für das double). Kann mir einer sagen wo der Fehler ist.
Danke.

Expandable
2006-09-20, 12:37:44
Ein Padding-Problem?

3x4 = 12, wird auf 16 aufgerundet, dann kommen die 8 Byte für den double.

Gast_
2006-09-20, 13:09:36
Kann mir einer sagen wo der Fehler ist.

Es gibt keinen. Der Compiler ordnet die Datenstruktur einfach so an Speichergrenzen aus indem er Füllbytes am Ende einfüllt.

Du kannst bei vielen Compilern mit proprietären Erweiterungen das Padding abschalten, aber was ist denn überhaupt der Zweck der Sache?

Gast_
2006-09-20, 13:10:29
Ach und noch was: Es gibt kein iostream.h. Das war noch nie im C++-Standard und wirds auch nie sein. Moderne Compiler schmeißen dir da ne Fehlermeldung.

Der richtige Header ist <iostream>.

_Gast__
2006-09-20, 14:28:40
Danke für die Hinweise. Ich muss mich jetzt erst mal einlesen aber wenn jemand eine gute seite kenn wo das erklärt wird kann er die seite mal posten.


aber was ist denn überhaupt der Zweck der Sache?

das hat keine sinn, aber ich hatte mal gesehen das eine klasse größer war als gedacht und nun wollte ich wisse warum.
Ich will ja nicht dumm sterben ;-)

ethrandil
2006-09-20, 15:23:51
So richtig viel gibts da glaube ich nicht zu erklären.

Wenn eine Klasse eine 'krumme' Größe hat, wird sie auf eine hübsche Zweierpotenz aufgerundet.
Das ist zwar Platzverschwendung aber soll wohl Geschwindigkeitsvorteile bringen.

mfg
- eth

muhkuh_rs
2006-09-20, 15:53:37
Jeder Member einer Klasse oder eines structs wird ausgerichtet am Minimum der Größe des Members und dem eingestellten member alignment Wert des Compilers. z.B. haben bei einem eingestellten member alignment des Compilers von 8 Instanzen dieser Klasse einen Speicherbedarf von 48 Byte.


class klasse2
{
bool bool1;
double gleitkommazahl1;
bool bool2;
double gleitkommazahl2;
bool bool3;
double gleitkommazahl3;
};

relative Speicheradresse : Klassenmember
0 : bool1
8 : gleitkommazahl1
16 : bool2
24:gleitkommazahl2
32: bool3
40:gleitkommazahl3

Die Ausrichtung bezieht sich auf den Anfang der Instanz im Speicher.

AnPapaSeiBua
2006-09-20, 16:31:47
class klasse2
{
double gleitkommazahl1;
int ganzzahl1;
int ganzzahl2;
int ganzzahl3;
};


Hi, versuch's mal so rum. Dann müsste 20 rauskommen.

_Gast__
2006-09-21, 07:53:36
Hi, versuch's mal so rum. Dann müsste 20 rauskommen.

Nein da ändert sich nichts.

Neomi
2006-09-21, 12:03:23
Hi, versuch's mal so rum. Dann müsste 20 rauskommen.

Das Alignment der gesamten Struktur muß stimmen, um das Alignment eines Elements darin sicherzustellen. In deinem Beispiel wird "ganzzahl3" zwar einen Offset von 16 Bytes zum Anfang der Struktur haben und ist natürlich 4 Bytes groß, trotzdem muß noch ein Padding von 4 Bytes rein. Ansonsten wäre in einem Array mit dieser Struktur als Basistyp das Alignment von "gleitkommazahl1" in jedem zweiten Arrayelement falsch.

PS: obwohl "class" für diese Struktur verwendet wird, ist es keine Klasse. In dem Fall ist es nur eine Struktur, auf deren Elemente niemand zugreifen kann, da der Defaultzugriffsmodus "private" ist (übrigens der einzige Unterschied zwischen "struct" und "class" in C++) und nicht explizit geändert wird.