Forum: Mikrocontroller und Digitale Elektronik Minimum Struct größe erzwingen


von alex (Gast)


Lesenswert?

Hallo.

Gibt es ein Befehl mit dem der Compiler nur 5Byte belegt und nicht 
8Byte?
1
typedef struct{
2
  uint8_t A; //1byte
3
  uint32_t B; //4byte
4
}st_x;
5
6
int main(void) {
7
  st_x  gg;
8
  uint16_t test = sizeof(gg); // test = 8
9
 while(1);
10
}

von Stefan F. (Gast)


Lesenswert?

GCC bietet dazu mehrere Möglichkeiten an. 
https://gcc.gnu.org/onlinedocs/gcc/Structure-Packing-Pragmas.html

von P. M. (o-o)


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.

von alex (Gast)


Lesenswert?

Ok hab ein 32Bit LPC.
Was sind da die Schlagwörter zum schlaumachen?

von Stefan F. (Gast)


Lesenswert?

Schlag auf den Hinterkopf bitte!

Alignment und Struckture-Packing

von Rolf M. (rmagnus)


Lesenswert?

alex schrieb:
> Was sind da die Schlagwörter zum schlaumachen?

Alignment (Ausrichtung)
http://de.wikipedia.org/wiki/Speicherausrichtung

von Stefan (Gast)


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

von Falk B. (falk)


Lesenswert?

Man kann auch einfach die Reihenfolge der Daten im Struct ändern. Dann 
kriegt man möglicherweise auch eine Minimalgröße hin, ohne das über 
spezielle Anweisungen zu erzwingen.

von Stefan (Gast)


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

von Peter II (Gast)


Lesenswert?

Stefan schrieb:
> Ggf. macht das aber je nach Optimierung
> auch der Compiler, ganz sicher bin ich mir da im Moment aber nicht.

nein, das darf der Compiler nicht machen.

von Karl H. (kbuchegg)


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.

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.