Minimum Struct größe erzwingen

alex schrieb:
> Gibt es ein Befehl mit dem der Compiler nur 5Byte belegt und nicht
> 8Byte?

Ja, wie bereits gepostet wurde.

Du solltest gleichzeitig aber die Anforderungen an das Alignment bei 
deinem Prozessor im Auge behalten. Beim AVR kein Thema, aber wenn dein 
Prozessor z.B. eine Wortbreite von 32 Bit hat, dann kann dein Vorhaben 
zu Problemen führen.
Gast
> Ok hab ein 32Bit LPC.
Gehts noch ein bischen ungenauer? Das kann ARM7 Cortex-M3 und alles 
mögliche andere sein.

Wichtig ist, ob Dein Controller misaligned Zugriffe überhaupt zulässt. 
Nur dann kann der Compiler da optimieren.
Und die andere Frage ist, ob Du wirklich misaligned Zugriffe erlauben 
oder lieber mehr Performance willst.

Gruß, Stefan
Gast
Daran habe ich auch schon gedacht. Wenn die daten im struct von groß 
nach klein sortiert werden, dann sollte fast immer die geschickteste 
Reihenfolge erreicht werden. Ggf. macht das aber je nach Optimierung 
auch der Compiler, ganz sicher bin ich mir da im Moment aber nicht.

Gruß, Stefan
Stefan schrieb:
> Daran habe ich auch schon gedacht. Wenn die daten im struct von groß
> nach klein sortiert werden, dann sollte fast immer die geschickteste
> Reihenfolge erreicht werden.

Nicht unbedingt.

Wenn in der genannten struct
1
typedef struct{
2
  uint8_t A; //1byte
3
  uint32_t B; //4byte
4
}st_x;

tatsächlich ein erzwungenes Alignment der Grund für eine sizeof von 8 
ist, dann wird auch nach einer Umsortierung
1
typedef struct{
2
  uint32_t B; //4byte
3
  uint8_t A; //1byte
4
}st_x;
die sizeof immer noch 8 sein.

Der Grund dafür ist, dass der Compiler auch ins Kalkül ziehen muss, dass 
du mit dieser struct ein Array aufbauen könntest.
1
st_x data[10];
und auch in diesem Fall muss dann das Alignment für data[1].B noch immer 
stimmen, was eine sizeof von 8 für die Struktur erzwingt.

Umsortierung bringt nur dann etwas, wenn es eine Möglichkeit gibt 
ansonsten 'freistehende' Member in die Alignment-Lücken zu verschieben.
1
typedef struct{
2
  uint8_t A; //1byte
3
  uint32_t B; //4byte
4
  uint8_t C; //1byte
5
}st_x;

falls es für einen uint8_t kein erzwungenes Alignment gibt, dann kann 
eine Umsortierung nach
1
typedef struct{
2
  uint8_t A; //1byte
3
  uint8_t C; //1byte
4
  uint32_t B; //4byte
5
}st_x;

oder hinter den uint32_t was bringen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.