Speicher Alignment Verständnis.
-
Nach meinem Wissen bedeutet alignment 4 dass für alle Daten 4,8,12 usw Bytes reserviert werden. So z.B wird ein Byte abgespeichert so werden 4 Bytes bemüht.
Dazu habe ich mir ein Test Programm geschrieben der einfach so aussieht:
struct SS{
BYTE i;
BYTE j;
BYTE jj;
};BYTE BA[2];
BA[0] = 5;
BA[1] = 7;LONG LA[2];
LA[0] = 8;
LA[1] = 9;SS k;
k.i = 7;
k.j = 8;
k.jj = 9;int o = sizeof(k);
int ab1 = __alignof(BYTE);
int ab2 = __alignof(SS) ;
int ab3 = __alignof(LONG) ;und stelle beim Debugger dass es Alignment 1 verwendet. D. die Adresse des BA[0] und BA[1] elementes ist um 1 erhöht.
Aber auch die Adresse des k.i , k.j und k.jj eine erhöhung um 1 aufweist.Also fand ich beim Compiler einstellung Struct Compiler einstellung eine Option um zumindest das Alignment zu ändern. So stllte ich es auf 4 aber das Ergebniss hat sich nicht verändert.
Dann stellte ich die Sturktur in #pragma pack(4) und auch da ist das Ergbniss nicht anders.Was verstehe ich da falsch und wie kann ich das alignment umstellen und sehen?
-
Ja, da hast du einiges mißverstanden.
Nimm mal dieses Struktur:struct S { byte a; int b; long c; byte d; }
Und schau dir bei den verschiedenen Alignment-Werten die einzelnen Offsets sowie sizeof(S) an!
-
Soweit so gut, ja ich erkenne die Verschiedenen reservierungen.
Aber nach wie vor stellt sich bei mir die Frage warum das nicht auf Struktur mir einfachen 2 Elementen mit jeweils 1 Byte nicht gilt.
-
warum das nicht auf Struktur mir einfachen 2 Elementen mit jeweils 1 Byte nicht gilt
Lern deutsch!
-
Ich möchte mich herzlich beim Diddi123 bedanken.
Seine Antwort hilft mir oder uns besseres Verständnis zu der gestelten Frage.Danke Diddi123, du bis so schlau.
-
Michael S. schrieb:
Soweit so gut, ja ich erkenne die Verschiedenen reservierungen.
Aber nach wie vor stellt sich bei mir die Frage warum das nicht auf Struktur mir einfachen 2 Elementen mit jeweils 1 Byte nicht gilt.
Alignment bedeutet nicht, dass jede Variable an der durch das Alignment eingestellten Grenze ausgerichtet sein soll. Hat die Variable einen kleinere Größe als das eingestellte Alignment, wird sie an Vielfachen ihrer Größe ausgerichtet.
Bsp.: Alignment auf 4
Ein short (2 Byte) wird an 2Byte Grenzen ausgerichtet
Ein double (8 Byte) wird an 4Byte Grenzen ausgerichtet
-
Unter Typical Alignment of C Structures on x86 wird ein ausfuehrliches Beispiel gegeben.