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

本文讨论了在C#中使用Pack特性解决结构体传递到C++时的对齐问题,解释了Pack参数的作用及其对结构体内存布局的影响,并通过示例展示了如何正确应用该特性以确保数据对齐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到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;
}
  
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)]

     

     

 

转载于:https://www.cnblogs.com/dipwater/archive/2012/11/21/2781156.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值