Wie funktioniert `__declspec(align(#))` arbeiten?
Ja, ich haben Lesen: http://msdn.microsoft.com/en-us/library/83ythb65.aspx
Aber es ist mir nicht klar. Zunächst __declspec(align(#))
macht jedes Objekt (in einer Struktur) erklärt-mit ihm starten Sie zu einem ausgerichteten offset. Das Teil ist klar. Die Ausrichtung in Ordnung ist auch 'geerbt', die durch das strukturierte Objekt ist. Aber es ändert nicht das Objekt, die Größe hat es? Genau, warum sizeof()
in diesem code:
__declspec(align(32)) struct aType {int a; int b;};
sizeof(aType);
zurück 32
?
InformationsquelleAutor NPS | 2013-08-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Größe des Objekts verwendet wird, berechnet die offsets, die in arrays und wenn Sie den Zeiger verwenden, so
sizeof(x)
muss immer ein Vielfaches der Werte. In diesem Fall, 1 x 32. Aber wenn Sie__declspec(align(32)) struct aType {int a[12]; };
, dann wäre die Größe 2 x 32 = 64, da sizeof(a) ist 12 x 4 = 48. Wenn wir das ändern zu richten an 4, 8 oder 16, wäre es 48.Dem, wie es tatsächlich funktioniert, ist, dass der compiler fügt einen unamed Polsterung Mitglied nach den benannten Mitgliedern der Struktur, füllen Sie die Struktur auf die Ausrichtung Größe.
Wenn es nicht funktioniert auf diese Weise, so etwas wie:
würde nicht richtig funktionieren, da der compiler multiplizieren
12
durchsizeof(aPtr)
hinzufügenaPtr
intern.Ja, die
struct
jetzt ist 32 bytes lang. 8 bytes für die beiden Integer-zahlen und 24 dieser bytes sind "Füller" zu füllen den leeren Raum zwischen den ersten und zweiten ATYP-Objekt in ein array, zum Beispiel.Ok, aber warum dann hier:
struct aType {int a; int b;}; typedef __declspec(align(32)) struct aType bType;
es ändert sich nur die Ausrichtung und nicht die Größe (MSDN, "die Definition Neuer Typen mit __declspec(align(#))")?Ehm, ich Wette
sizeof(bType)
32... Obwohl ich nicht MS-compiler finden Sie auf meiner Linux-Kiste, also kann ich nicht einfach testen. AnsonstenbType *bPtr = malloc(sizeof(bType) * 10);
würde nicht produzieren einen block von Speicher, der geeignet ist fürbPtr[5].a = 42;
...MSDN sagt, es ist 8 und ich habe es - es ist (sowohl
aType
undbType
).InformationsquelleAutor Mats Petersson
Die Dokumentation ist entweder schlecht geschrieben oder meine Beherrschung der englischen Sprache als Fremdsprache ist nicht bis zu par mit.
Den
__declspec(align(#))
betrifft nur die Ausrichtung der Struktur und dersizeof()
, NICHT jedes der Mitglieder. Wenn Sie möchten, dass jede Eigenschaft, die ausgerichtet werden, müssen Sie zum angeben der Ausrichtung auf Ebene der Mitgliedsstaaten.Ich auch zunächst davon ausgegangen, dass ein
struct-level __declspec(align())
beeinflusst, und es ist den Mitgliedern muss es aber nicht. Also, wenn Sie pro Mitglied die Ausrichtung, die Sie benötigen, um genau zu sein.InformationsquelleAutor CodeAngry