【问题标题】:structure alignment to port code to 64-bit将端口代码结构对齐到 64 位
【发布时间】:2009-02-12 11:49:30
【问题描述】:

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

我有一个与结构对齐有关的一般性问题,想先澄清一下,以免错过任何内容。

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

谁能解释这种行为?

谢谢, 尼兰詹

【问题讨论】:

    标签: 64-bit structure memory-alignment


    【解决方案1】:

    我偶然发现了这篇 msdn 文章 http://msdn.microsoft.com/en-us/library/aa366769(VS.85).aspx

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多