Minimum Struct größe erzwingen

#3924798
Lesenswert?

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 #3924874
Lesenswert?

> 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 #3924997
Lesenswert?

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
#3925019
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren