2009-02-12 6 views
0

J'ai un assembly .NET 32 bits qui PInvoque dans la couche C. Je veux porter cet assembly à 64 bits. J'ai lu de nombreux documents relatifs au portage en 64 bits, ce qui semble indiquer que nous devons prendre soin de l'alignement si nous voulons utiliser des structures.alignement de la structure au code de port à 64 bits

J'avais une question générale liée à l'alignement de la structure et je voulais d'abord clarifier cela afin que je ne manque rien. Supposons que j'ai un point d'entrée C qui accepte un pointeur struct et remplit les valeurs à l'intérieur. Ce code C n'a aucune directive d'emballage et toutes les structures .NET sont alignées sur pack = 8. Donc, si je passe une structure avec des ints adjacents, j'ai pensé qu'il pourrait être un problème d'interprétation des données peuplées dans la couche .NET, car le C par défaut utiliserait pack = 4 et nous interprétons la structure comme pack = 8 dans .NET couche, alors pensé qu'il pourrait causer un problème. Mais cela ne semble pas être le cas. Les données semblent être bien interprétées.

Quelqu'un peut-il expliquer ce comportement?

Merci, Niranjan

Répondre

0

je suis tombé sur cet article msdn http://msdn.microsoft.com/en-us/library/aa366769(VS.85).aspx

Il suggère que la spécification d'un niveau d'emballage plus grand que l'alignement naturel d'un type ne change pas l'alignement de type. Donc, puisque l'alignement naturel dans le cas ci-dessus que j'ai mentionné est 4, le réglage de l'emballage à 8 ne change pas vraiment l'alignement de la structure. Ceci explique le comportement.

0

Par défaut, les membres d'une structure ou d'une union sont alignés sur leurs limites naturelles; un octet pour un caractère, deux octets pour un caractère court, quatre octets pour un nombre entier, etc. Si n est présent, il doit s'agir d'une puissance de 2 spécifiant l'alignement naturel le plus strict pour toute structure ou membre d'union. Par exemple, #pragma pack (2) aligne int, long, long long, float, double, long double et pointeurs sur deux frontières d'octets au lieu de leurs limites d'alignement naturelles. Si n est identique ou supérieur à l'alignement le plus strict sur votre plate-forme (quatre sur x86, huit sur SPARC v8 et 16 sur SPARC v9), la directive a l'effet de l'alignement naturel.

Je ne suis pas sûr si l'architecture x86 prend en charge l'alignement de 8 octets même s'ils prennent en charge un environnement 64 bits. Après tout, l'alignement de 4 octets sur une plate-forme 64 bits ne nuirait à rien.

Vous pouvez également utiliser: #pragma align 8 (variable) pour indiquer au compilateur comment aligner une variable globale ou statique.

Questions connexes