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 | }
|
|
Forum: Mikrocontroller und Digitale Elektronik Minimum Struct größe erzwingenHallo. Gibt es ein Befehl mit dem der Compiler nur 5Byte belegt und nicht 8Byte?
GCC bietet dazu mehrere Möglichkeiten an. https://gcc.gnu.org/onlinedocs/gcc/Structure-Packing-Pragmas.html 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. Ok hab ein 32Bit LPC. Was sind da die Schlagwörter zum schlaumachen? Schlag auf den Hinterkopf bitte! Alignment und Struckture-Packing alex schrieb: > Was sind da die Schlagwörter zum schlaumachen? Alignment (Ausrichtung) http://de.wikipedia.org/wiki/Speicherausrichtung > 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
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. 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: > 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. 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
tatsächlich ein erzwungenes Alignment der Grund für eine sizeof von 8 ist, dann wird auch nach einer Umsortierung
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.
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.
falls es für einen uint8_t kein erzwungenes Alignment gibt, dann kann eine Umsortierung nach
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.
|
|