我有一个32位的.NET组件,其PInvokes到C层。我想这个端口装配到64位。我已阅读相关的移植到64位,所有这一切似乎表明,我们需要对齐的照顾,如果我们使用结构许多文件。

我不得不涉及到结构比一般的问题,并希望澄清的是第一个让我不要错过任何东西。

假设我有它接受一个结构指针和基本上里面填满值一个C入口点。这种C代码没有任何包装的指令和我都一致收拾= 8的.NET结构。所以,如果我传递一个结构与相邻的整数,我认为这可能是一个问题解释填充在.NET层中的数据,与C默认将使用包= 4,我们在.NET解释结构作为包= 8层,所以认为这可能会导致一个问题。但它似乎并不如此。这些数据似乎是解释的罚款。

任何人都可以解释这种现象?

谢谢,   NIRANJAN

有帮助吗?

解决方案

我这个MSDN文章碰上了 http://msdn.microsoft.com/en-us /library/aa366769(VS.85).aspx

这表明,指定填料电平低于一类型的自然对齐较大不改变类型对准。所以,由于在上述情况下,我所提到的自然对齐是4,包装设置为8并没有真正改变结构的比对。这解释了行为。

其他提示

默认情况下,结构或联合的成员在他们的自然边界对齐;对一个字符的一个字节,对于短的两个字节,用于整数等四个字节如果存在n,它必须为2指定为任何结构或联合成员最严格的自然对齐的功率。

例如,包的#pragma(2)对齐的两个字节边界,而不是他们的自然对准边界整型,长,长长整型,浮点,双,长双,和指针。如果n等于或大于平台上最严格的对齐,(四国86,八上 SPARC V8,和在SPARC V9 16),所述指令具有自然对齐的效果。

我不知道如果x86架构支持8字节对齐,即使它们支持一个64位的环境。毕竟,在64位的平台上4字节对齐不会损害任何事。

您还可以使用指示:#pragma对齐8(变量)来告诉编译器要如何对齐的全局或静态变量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top