C# 传递给C++函数的结构体没有对齐的问题

今天遇到C#传递结构体到C++ 返回结果没有对齐的问题,后来在网上查到定义结构体时可以添加 Pack 特性。

MSDN讲解如下:

此字段指示在指定 LayoutKind. Sequential 值时应使用的内存边界。

Pack 的值必须介于 0、1、2、4、8、16、32、64 或 128:

  • 值为 0 则指示封装对齐方式设置为当前平台的默认值。

  • 1 值表示字节边界上发生的数据对齐。封装值为 1 的字段之间无间隙。

  • 封装值 2 和更高的值将导致字节上要对齐的每个字段相对于结构的开头进行偏置。因此,数据字段将在偏移量上开始,偏移量是请求的封装值的倍数。

此字段指示在指定 LayoutKind. Sequential 值时应使用的内存边界。

Pack 的值必须介于 0、1、2、4、8、16、32、64 或 128:

  • 值为 0 则指示封装对齐方式设置为当前平台的默认值。

  • 1 值表示字节边界上发生的数据对齐。封装值为 1 的字段之间无间隙。

  • 封装值 2 和更高的值将导致字节上要对齐的每个字段相对于结构的开头进行偏置。因此,数据字段将在偏移量上开始,偏移量是请求的封装值的倍数。

下面的示例包含一个带有三个单字节字段的结构:

struct MyStruct
{
  byte B0;
  byte B1;
  byte B2;
}
  

不管封装值如何,字节 B0 始终从偏移量为 0(0 字节)处开始。

封装值 0 将产生以下结果:

  • B0 将在偏移量为 0(字节 0)处开始。

  • B1 将在偏移量为 1(字节 1)处开始。

  • B2 将在偏移量为 2(字节 2)处开始。

请注意默认平台的对齐方式将总是连续打包相同类型。

封装值 1 将产生以下结果:

  • B0 仍将在偏移量为 0(字节 0)处开始。

  • B1 仍将在偏移量为 1(字节 1)处开始。

  • B2 仍将在偏移量为 2(字节 2)处开始。

但是,封装值 2 将产生以下结果:

  • B0 仍将在偏移量为 0(字节 0)处开始。

  • B1 将在偏移量为 2(字节 2)处开始。

  • B2 将在偏移量为 4(字节 4)处开始。

同样,n 的一个封装值将产生以下结果:

  • B0 仍将在偏移量为 0(字节 0)处开始。

  • B1 将在偏移量为 n(字节 n)处开始。

  • B2 将在偏移量为 n*2(字节 2n)处开始。

     

    我添加了 Pack=1之后结构体就正确对齐了。

    [StructLayoutAttribute(LayoutKind.Sequential, Pack=1)]

     

     

 

posted @ 2012-11-21 18:03  浸水  阅读(2462)  评论(1编辑  收藏  举报