0

我有一个 32 位 .NET 程序集,它 PInvoke 到 C 层。我想将此程序集移植到 64 位。我已经阅读了许多与移植到 64 位相关的文档,所有这些似乎都表明如果我们要使用结构,我们需要注意对齐。

我有一个与结构对齐有关的一般性问题,想先澄清一下,这样我就不会错过任何东西。

假设我有一个 C 入口点,它接受一个结构指针并基本上填满了里面的值。此 C 代码没有任何打包指令,并且所有 .NET 结构都与 pack=8 对齐。因此,如果我传递具有相邻整数的结构,我认为解释 .NET 层中填充的数据可能会出现问题,因为 C 默认情况下会使用 pack=4,而我们在 .NET 中将结构解释为 pack=8层,所以认为它可能会导致问题。但似乎并非如此。数据似乎解释得很好。

谁能解释这种行为?

谢谢,尼兰詹

4

2 回答 2

0

我遇到了这篇 msdn 文章 http://msdn.microsoft.com/en-us/library/aa366769(VS.85).aspx

它表明指定大于类型自然对齐的打包级别不会更改类型对齐。因此,由于我提到的上述情况下的自然对齐方式是 4,因此将包装设置为 8 并不会真正改变结构的对齐方式。这解释了这种行为。

于 2009-02-20T07:05:19.393 回答
0

默认情况下,结构或联合的成员在其自然边界上对齐;char 一个字节,short 两个字节,整数四个字节等。如果 n 存在,它必须是 2 的幂,指定任何结构或联合成员的最严格的自然对齐。

例如,#pragma pack(2) 在两个字节边界上对齐 int、long、long long、float、double、long double 和指针,而不是它们的自然对齐边界。如果 n 等于或大于平台上最严格的对齐方式(x86 上为 4,SPARC v8 上为 8,SPARC v9 上为 16),则该指令具有自然对齐的效果。

我不确定 x86 架构是否支持 8 字节对齐,即使它们支持 64 位环境。毕竟,64 位平台上的 4 字节对齐不会造成任何损害。

您还可以使用:#pragma align 8 (variable) 告诉编译器您希望全局或静态变量如何对齐。

于 2009-09-23T23:35:38.230 回答