Strukturen Alignment
-
Hallöchen,
Ich versteh den Sinn vom Alignment von Strukturen nicht: Wenn ich ein 32-Bit-System habe, habe ich ein 4-Byte-Alignment. Bei 64-Bit-Systemen ein 8-Byte-Alignment. Ich kann ja nicht beide Alignments abdecken. Was bringt es mir dann, wenn mein Programm z. B. aufs 4-Byte-Alignment spezialisiert ist und damit das 8-Byte-Alignment nicht abgedeckt wird? Dann kann ich doch die Alignment-Geschichte gleich sein lassen oder?
Klärt mich bitte auf.
-
Was machst du denn als Programmierer mit dem Alignment? Normalerweise solltest du das gar nicht zu Gesicht bekommen und einfach so programmieren, als ob es das nicht gäbe. Das heißt insbesondere eben keine Annahmen darüber zu machen und das Programm durch wildes gecaste auf ein bestimmtes ALignment festzulegen.
-
64-bit-Programme werden extra kompiliert. Natürlich kannst du auch 32-bit-Programme auf einem 64-bit-System laufen lassen, aber die haben dann halt eventuell einen kleinen Geschwindigkeitsnachteil.
-
Auf 32-Bit Systemen ist das (struct)Alignment unspezifiziert weil compilerabhängig.
Auf 64-Bit Systemen ist das (struct)Alignment unspezifiziert weil compilerabhängig.
Das explizite Setzen des Alignments ist unspezifiziert weil ebenfalls compilerabhängig und nicht Sprachstandard.
-
Die ganze Sache mit dem Alignment kommt daher, dass eine ganze Reihe CPUs Speicher nur wortweise ansprechen können (insbesondere RISC-Maschinen) und bei einer Load- bzw. Store-Anweisung auf eine dem nicht entsprechende Adresse schlicht einen Alignment-Fehler generieren. Das betrifft unter anderem SPARC. Einige andere wie beispielsweise MIPS haben besondere Opcodes für unaligned-load/store, die im Grunde auf zwei aligned-load/store hinauslaufen, also deutlich langsamer sind.
x86 hat diese Einschränkung nie gehabt, also war das für PCs lange Zeit unproblematisch, aber mit der Einführung von SSE2 gibt es auch hier Anweisungen, die nur auf entsprechend ausgerichtetem Speicher arbeiten können.
Wie man damit am besten umgeht, hängt vom Anwendungsfall ab. Wenn es um Datenübertragung bzw. -speicherung geht, also das Volumen möglichst klein gehalten werden soll, und wenn außerdem alle unterstützten Plattformen damit zurechtkommen bzw. Compiler zur Verfügung stehen, die entsprechenden Maschinencode generieren können, ist es im Zweifel sinnvoll, sich ums Alignment nicht zu scheren und packed structs zu benutzen.
Ansonsten kann man auch unter den unterstützten Plattformen das größte Alignment raussuchen und für alle benutzen - das werden alles Zweierpotenzen sein, und wenn Ausrichtung auf 4 Byte gefordert ist, funktioniert Ausrichtung auf 8 Byte auch, weil 8 ein Vielfaches von 4 ist.