Gast
#3924784
Hallo. Gibt es ein Befehl mit dem der Compiler nur 5Byte belegt und nicht 8Byte?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
|
Anzeige
|
Minimum Struct größe erzwingen
Gast
#3924784
Hallo. Gibt es ein Befehl mit dem der Compiler nur 5Byte belegt und nicht 8Byte?
Gast
#3924786
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.
Gast
#3924818
Ok hab ein 32Bit LPC. Was sind da die Schlagwörter zum schlaumachen?
Gast
#3924821
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
Gast
#3924874
> 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.
Gast
#3924997
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
Gast
#3925014
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. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|