PicNeuling schrieb:
> Hallo an alle,
>
> ich bin gerade am Lernen für eine C- Klausur und kam auf die Frage:
>
> Was ist ein Strukturalignment?
>
> Das hab ich noch nirgends gehört und auch nicht adäqutes in der Hilfe
> oder Google gefunden.
Beim Alignment geht es darum, dass manche Prozessoren zb nicht auf
ungerade Adressen zugreifen können. Andere wiederrum können das, aber
nur unter erhöhter Laufzeit. Bei wiederrum anderen ist es völlig egal.
Hast du jetzt zb einen Prozessor, der von einer ungeraden Adresse nicht
lesen kann, dann wird es logischerweise sinnvoll sein, alle Variablen so
auszurichten, dass jede Variable an einer geraden Speicheradresse liegt.
In einer Struktur
struct test {
unsigned char i;
unsigned char j;
};
wird es daher sinnvoll sein, zwischen i und j 1 zusätzliches Byte
einzuschieben und dafür zu sorgen, dass so eine Strukturvariable als
Ganzes an einer geraden Speicheradresse liegt. Auch wird ein Compiler,
der auf das Alignment aufpassen muss, hinter j noch ein weiteres
zusätzliches Byte einschieben, um die sizeof() der kompletten Struktur
wieder auf eine gerade Zahl anzuheben. Das ist zb wichtig, wenn Arrays
aus diesen Strukturen gebaut werden.
Damit kann der Prozessor immer maximal schnell zugreifen. i als erstes
Member der Struktur liegt an einer geraden Speicheradresse (durch das
Alignment der ganzen Struktur garantiert) und j ebenfalls (durch das
zwischen i und j eingeschobene Byte garantiert). Die eingeschobenen
Bytes nennt man 'Padding Bytes' und die Ausrichtung der ganzen Struktur
ist das Strukturalignment.
Alignment ist einfach nur der englische Begriff für Ausrichtung. Gemeint
ist damit die Ausrichtung von 'Objekten' im Speicher in Bezug auf die
Adressierbarkeit. Interessant ist das nur, wenn es Einschränkungen in
der Adressierbarkeit gibt, die sich dann in Alignment-Restriktionen
niederschlagen, die der Compiler berücksichtigen muss.