Forum: Compiler & IDEs Speicherbedarf bei leeren Klassen


von Mark .. (mork)


Lesenswert?

Hallo,

weis jemand, wieso beim avr-gcc Objekte selbst dann RAM verbrauchen, 
wenn diese überhapt keine nichtstatische Variablen enthalten? Es wird 
immer 1 Byte pro Objekt gebraucht. Was auch seltsam ist: wenn ich in der 
Klasse einfach eine zusätzliche char-Variable definiere, sind es immer 
noch 1 byte/Objekt.

MfG Mark

von Andreas K. (a-k)


Lesenswert?

Muss so sein. Sonst hätten verschiedene Objekte u.U. die gleiche 
Adresse.

von Mark .. (mork)


Lesenswert?

Das macht Sinn. Kann man es trotzdem mit irgendeiner Compiler-Option 
ausstellen?

MfG Mark

von Karl H. (kbuchegg)


Lesenswert?

Mark Prediger wrote:
> Das macht Sinn. Kann man es trotzdem mit irgendeiner Compiler-Option
> ausstellen?

Nein. Wie Andreas schon sagte: Das muss so sein.

Wenn du beispielsweise ein Array machst, so wird gefordert, dass
alle Array Elemente unterschiedliche Adressen im Speicher haben.
Hätte eine leere Klasse eine Größe von 0 Bytes, so hätte
auch ein Array aus derartigen Elementen eine Größe von 0
Bytes und folgerichtig würden alle Array Elemente dann auch
dieselbe Adresse im Speicher haben. Das darf aber nicht sein
und daher kann ein Objekt einer Klasse auch keine Größe 0
haben.

Das ist aber auch nicht wirklich ein Problem. Eine absolut
leere Klasse hat man praktisch nur in den wenigsten Fällen.
Meistens handelt es sich um irgendwelche Basisklassen einer
Vererbungshierarchie. Von diesen Klassen selbst werden aber
normalerweise keine Objekte gebildet. Und bei abgeleiteten
Klassen berücksichtigt dann der Compiler dieses 1 Byte
und nimmt es wieder raus, sodass Objekte von abgeleiteten Klassen
wieder die erwartete Größe besitzen.

von Rolf Magnus (Gast)


Lesenswert?

> Hätte eine leere Klasse eine Größe von 0 Bytes, so hätte
> auch ein Array aus derartigen Elementen eine Größe von 0
> Bytes und folgerichtig würden alle Array Elemente dann auch
> dieselbe Adresse im Speicher haben.

Man könnte auch sagen, sie haben gar keine Adresse, denn um eine Adresse 
zu haben, müßten sie erst einmal Speicher belegen.

> Meistens handelt es sich um irgendwelche Basisklassen einer
> Vererbungshierarchie.

Ein anderer Fall sind Funktionsobjekte, die an Templates übergeben 
werden. Aber da ist es normalerweise auch kein Problem und wird meistens 
ganz wegoptimiert.

von Mark .. (mork)


Lesenswert?

Alles klar, Danke für die Erklärung.

MfG Mark

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.