今天遇到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

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

  1. 定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年 问题。 写一个函数days,实现上述计算。由主函数将年、月、日传递给days函数,计算后将 日子数传回主函数输出

    /*定义一个结构体变量(包括年.月.日).计算该日在本年中是第几天,注意闰年 问题. 写一个函数days,实现上述计算.由主函数将年.月.日传递给days函数,计算后将 日子数传回主函数输出*/#in ...

  2. C++函数(三)------函数与结构体

    ------------------------函数与结构体--------------------------------- 1.结构体复习 关于结构体,我以前有对结构体做过基础的讲解. 我们可以使 ...

  3. C语言经典例71-编写函数输出结构体数据

    目录 1 题目 2 分析 3 实现 4 运行结果 1 题目 编写input()和output()函数输入,输出5个学生的数据记录. 2 分析 定义结构体,声明结构体数组,再编写函数传入结构体数组指针到 ...

  4. html表单文本框怎么输出函数值,如何获取用户输入的html文本表单字段传递给javascript函数的值?...

    我想通过生成用户必须输入到文本输入表单字段的随机数创建我自己的反垃圾邮件过滤器,如果它是正确的,他们进入下一页,如果不是,则显示错误数字输入不正确.如何获取用户输入的html文本表单字段传递给java ...

  5. C++:C++语言入门级基础知识考察点回顾之函数、结构体和类

    C++:C++语言入门级基础知识考察点回顾之函数.结构体和类 目录 C++的函数 1.函数的定义.调用,全局变量局部变量 1.1.自定义函数求其倒数

  6. 获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf

    http://blog.csdn.net/windeal3203/article/details/39320605 Linux 下 可以使用ioctl()函数 以及 结构体 struct ifreq ...

  7. 动态html函数的写法,如何将html div id的动态传递给js函数

    我想将div id从html动态传递给js脚本 因为div id r1,r2,r3需要传入jS中的getElementById(),所以当用户鼠标放在任何div上,它会自动旋转.如何将html div ...

  8. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例

    C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...

  9. 通过宏函数计算结构体成员偏移量

      编译器在为结构体成员分配内存时,由于存在内存对齐机制,各个成员所占空间可能不是连续的,因而不能简单的通过成员类型所占的字长来推断其它成员或结构体对象的地址.   获得结构体成员偏移量的方法可以参照 ...

  10. 洛谷刷题记录(python)【入门6】函数与结构体

    [入门6]函数与结构体https://www.luogu.com.cn/training/105#problems P5735 [深基7.例1]距离函数 import mathdef solve(a, ...

最新文章

  1. GitHub回应突然断供:身在美国不由己,无权提前通知预警
  2. Kingdee v7.0账套修复
  3. sqlsugar 批量删除guid类型主键_一文上手SqlSugar 「C# 数据操作系列」
  4. sql 大数据量插入优化
  5. java 内核驱动程序_内核第三讲,进入ring0,以及编写第一个内核驱动程序.
  6. PowerShell监控——监控共享打印机 获取打印记录、打印人员、打印文件等详细信息
  7. JavaScript中函数式编程的原理
  8. 关于大型网站技术演进的思考(十四)--网站静态化处理—前后端分离—上(6)...
  9. windows配置java环境变量
  10. 寻找影响免疫浸润细胞的基因(一)
  11. c语言自学基础知识视频,C语言 基础课堂视频教程
  12. 海外拼多多Temu最新动态,怎么快速提升销量和权重?(测评补单)
  13. FYI | OHBM/Brain 会议投稿指北
  14. TextRank算法讲解与代码实现
  15. mysql reconnect_在设置了MYSQL_OPT_RECONNECT之后,mysql_ping是否还有必要?
  16. Android安卓毕业设计,SpringBoot+MySQL+Android studio 实现一个二手交易平台APP
  17. java后端返回二进制图片 前端进行展示 详解
  18. tif文件转为shp文件_从Tif文件转为shp文件(ArcMap,代码)、gdal打包问题
  19. 腾讯嵌入式系统tos移植到正点原子阿波罗F429
  20. 第一课:路由器宽带拨号入网(小米路由器)

热门文章

  1. opencv中Mat的数学运算和基本操作
  2. 将循环结果写入到新建的dataframe中
  3. Matlab多光谱kmeans聚类分割
  4. Arcgis利用点数据集(txt数据)转为shp线数据(含案例)
  5. python-excel 批量输出文件名字与打开excel文件
  6. 【ArcGIS|空间分析】叠置分析(易混工具使用)
  7. ndows外壳公用dll,Windows外壳公用DLL已停止工作
  8. 实习踩坑之路:parallelStream并发流+快速失败导致线上CPU300%的血泪史
  9. 查找算法------顺序查找
  10. JavaSE学习--HTML