www.mikrocontroller.net

Forum: Compiler & IDEs Speicherbedarf bei leeren Klassen


Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss so sein. Sonst hätten verschiedene Objekte u.U. die gleiche 
Adresse.

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das macht Sinn. Kann man es trotzdem mit irgendeiner Compiler-Option 
ausstellen?

MfG Mark

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar, Danke für die Erklärung.

MfG Mark

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.