Comment est-ce que " __declspec(aligner (#)) de travail?
Oui, je ont lire ceci: http://msdn.microsoft.com/en-us/library/83ythb65.aspx
Mais il n'est pas clair pour moi. Tout d'abord, __declspec(align(#))
rend chaque objet (dans une structure) a déclaré avec elle commencer à un décalage aligné. Cette partie est clair. L'aligment est aussi "hérité" par de la structuration de l'objet est dans. Mais on ne change pas la taille de l'objet, n'est ce pas? Justement, pourquoi ne sizeof()
dans ce code:
__declspec(align(32)) struct aType {int a; int b;};
sizeof(aType);
retour 32
?
Vous devez vous connecter pour publier un commentaire.
La taille de l'objet est utilisée pour calculer les décalages dans les tableaux et lorsque vous utilisez les pointeurs,
sizeof(x)
doit toujours être un multiple de la valeur d'alignement. Dans ce cas, 1 x 32. Mais si vous avez__declspec(align(32)) struct aType {int a[12]; };
, alors que la taille serait de 2 x 32 = 64, depuis sizeof(a) est de 12 x 4 = 48. Si l'on change l'alignement de 4, 8 ou 16, il serait 48.La façon dont cela fonctionne est que le compilateur ajoute un unamed rembourrage membre après l'nommé les membres de la structure, pour remplir la structure de l'alignement de la taille.
Si il ne fonctionne pas de cette façon, quelque chose comme:
ne fonctionne pas, car le compilateur va multiplier
12
parsizeof(aPtr)
à ajouter àaPtr
en interne.struct
est maintenant de 32 octets de long. 8 octets pour les deux entiers et 24 de ces octets sont de "remplissage" pour remplir l'espace vide entre la première et la deuxième aType objet dans un tableau, par exemple.struct aType {int a; int b;}; typedef __declspec(align(32)) struct aType bType;
il modifie uniquement l'alignement et pas de la taille (MSDN, "la Définition de Nouveaux Types avec de __declspec(aligner(#))")?sizeof(bType)
sera de 32... Bien que je n'ai pas de MS compilateur disponible sur mon Linux, donc je ne peux pas facilement le tester. Sinon,bType *bPtr = malloc(sizeof(bType) * 10);
ne serait pas produire un bloc de mémoire qui est approprié pourbPtr[5].a = 42;
...aType
etbType
).malloc
ounew
scénario.La documentation est soit mal écrit ou ma commande de l'anglais comme une langue étrangère n'est pas à la hauteur avec elle.
La
__declspec(align(#))
n'affecte que l'alignement de la structure et de lasizeof()
, PAS chacun des membres. Si vous souhaitez que chaque propriété d'être aligné, vous devez spécifier l'alignement au niveau des membres.J'ai aussi initialement supposé que un
struct-level __declspec(align())
l'affecte et ses membres, mais il ne le fait pas. Donc, si vous voulez par membre de l'alignement, vous avez besoin pour être précis.