VC++2k5: struct member alignment für einzelne Struktur setzten (__declspec (align(X)) funzt ned)
-
Halllo,
brauch für ein paar Strukturen ein Memberalignment von einem Byte.
Projektweite Einstellung über Compileroption würde ich gerne vermeiden.
Laut http://msdn2.microsoft.com/en-us/library/83ythb65.aspx
müsste es doch mit __declspec(align(X)) funktionieren:__declspec(align(1)) struct myStruct { char c; int i; }; void testFunc() { myStruct ms; int s1 = sizeof(char) + sizeof(int); int s2 = sizeof(myStruct); }
Die Proejektweite Einstellung steht auf dem Standardwert (4Byte).
Soweit so gut, im Watch seh ich folgende Werte
&ms.c == 0x0012ED18 // Addresse vom char in der Struktur &ms.i == 0x0012ED1C // Addr. vom int in der Strukutr, sollte den Wert 0x0012ED19 haben s1 == 5 // OK s2 == 8 // sollte eigentlich auch 5 sein
Wenn Projektweit ein Struct Member Alignment von 1 Byte eingestellt ist,
dann sind alle Werte wie erwartet.Was hab ich also verbockt?
Ich hab keine Ahnung...Danke schon mal
Martin
-
Ich würde es so machen:
#pragma pack(push, r1, 1) //#pragma pack(show) // C4810 // Definiere hier Deine Struktur #pragma pack(pop, r1)
-
__declspec(align(#)) richtet nur die Sachen aus, für die es angegeben wurde. In deinem Beispiel ist das myStruct, also wird auch nur dafür gesorgt, dass ein Objekt der Struktur entsprechend ausgerichtet wird. Die Member sind davon aber nicht betroffen. Und selbst wenn du __declspec(align(#)) für jeden Member angibst, wäre das vollkommen ungeeignet für dein Problem, da damit lediglich ein Minimum Alignment garantiert wird. Wenn du also __declspec(align(1)) spezifizierst, können die Daten an jeder beliebigen Adresse ausgerichtet werden. Es muss also nicht so sein, dass die Daten direkt hintereinander liegen. Der Compiler kann dann praktisch machen, was er will. Denn egal wie er die Daten auch legt, ein Alignment von 1 ist immer erfüllt.
Data in classes or structures is aligned within the class or structure at the minimum of its natural alignment and the current packing setting (from #pragma pack or the /Zp compiler option).
Wie Jochen schon schrieb, #pragma pack ist das, wonach du suchst.
-
Tjo, gut dass es Leute gibt, die sowas wissen
Danke