Pourquoi les projets x64 utilisent-ils un alignement par défaut de 16?

Si vous comstackz le code suivant dans un projet x64 dans VS2012 sans aucun indicateur / Zp:

#pragma pack(show) 

alors le compilateur va cracher:

 value of pragma pack(show) == 16 

Si le projet utilise Win32, le compilateur va cracher:

 value of pragma pack(show) == 8 

Ce que je ne comprends pas, c’est que le plus grand alignement naturel de n’importe quel type (c.-à-d. Long long et pointeur) dans Win64 est 8. Alors, pourquoi ne pas simplement faire l’alignement par défaut 8 pour x64?

Un peu lié à cela, pourquoi quelqu’un utiliserait-il / Zp16?

MODIFIER:

Voici un exemple pour montrer de quoi je parle. Même si les pointeurs ont un alignement naturel de 8 octets pour x64, Zp1 peut les forcer à une limite de 1 octet.

 struct A { char a; char* b; } // Zp16 // Offset of a == 0 // Offset of b == 8 // Zp1 // Offset of a == 0 // Offset of b == 1 

Maintenant, si nous prenons un exemple qui utilise SSE:

 struct A { char a; char* b; __m128 c; // uses declspec(align(16)) in xmminsortingnsic.h } // Zp16 // Offset of a == 0 // Offset of b == 8 // Offset of c == 16 // Zp1 // Offset of a == 0 // Offset of b == 1 // Offset of c == 16 

Si __m128 était vraiment un type intégré, je pense que le décalage devrait être de 9 avec Zp1. Mais comme il utilise __declspec (align (16)) dans sa définition dans xmminsortingnsic.h, cela l’emporte sur tous les parameters Zp.

Alors voici ma question un peu différente: y a-t-il un type pour ‘c’ qui a un alignement naturel de 16B mais qui aura un décalage de 9 dans l’exemple précédent?

La page MSDN inclut ici les informations pertinentes suivantes sur votre question “Pourquoi ne pas faire l’alignement par défaut 8 pour x64?”:

L’écriture d’applications utilisant les dernières instructions du processeur introduit de nouvelles contraintes et problèmes. En particulier, de nombreuses nouvelles instructions exigent que les données soient alignées sur des limites de 16 octets. De plus, en alignant les données fréquemment utilisées sur la taille de la ligne de cache d’un processeur spécifique, vous améliorez les performances du cache. Par exemple, si vous définissez une structure dont la taille est inférieure à 32 octets, vous souhaiterez peut-être l’aligner sur 32 octets pour vous assurer que les objects de ce type de structure sont efficacement mis en cache.

Pourquoi les projets x64 utilisent-ils un alignement par défaut de 16?

Sur x64, le virgule flottante est effectué dans l’unité SSE. Vous déclarez que le plus grand type a l’alignement 8. Mais ce n’est pas correct. Certains types insortingnsèques de SSE, par exemple __m128 , ont un alignement de 16.