我有一个32位的.NET程序集,它可以进入C层。我想将此程序集移植到64位。我已经阅读了许多与移植到64位相关的文档,所有这些文档似乎都表明如果我们要使用结构,我们需要注意对齐。
我有一个与结构对齐有关的一般性问题,并希望首先澄清这一点,以便我不会错过任何东西。
假设我有一个C入口点,它接受一个结构指针并基本上填满了里面的值。这个C代码没有任何打包指令,我将所有.NET结构与pack = 8对齐。因此,如果我传递一个带有相邻整数的结构,我认为解释.NET层中填充的数据可能是个问题,因为默认情况下C会使用pack = 4而我们在.NET中将结构解释为pack = 8层,所以认为它可能会导致问题。但似乎并非如此。数据似乎被解释得很好。
任何人都可以解释这种行为吗?
谢谢, NIRANJAN
答案 0 :(得分:0)
我遇到了这篇msdn文章 http://msdn.microsoft.com/en-us/library/aa366769(VS.85).aspx
它建议指定大于类型的自然对齐的打包级别不会更改类型对齐。因此,我提到的上述情况中的自然对齐是4,将填充设置为8并不会真正改变结构的对齐。这解释了这种行为。
答案 1 :(得分:0)
默认情况下,结构或联合的成员在其自然边界上对齐; char的一个字节,short的两个字节,整数的四个字节等。如果n存在,则它必须是2的幂,指定任何结构或联合成员的最严格的自然对齐。
例如,#pragma pack(2)将int,long,long long,float,double,long double和指针对齐在两个字节边界而不是它们的自然对齐边界上。如果n与平台上最严格的对齐方式相同或更大,(x86上有4个,上面有8个 SPARC v8和SPARC v9上的16,该指令具有自然对齐的效果。
我不确定x86架构是否支持8字节对齐,即使它们支持64位环境。毕竟,64位平台上的4字节对齐不会对任何事情造成伤害。
您还可以使用:#pragma align 8(variable)告诉编译器您希望全局变量或静态变量如何对齐。