zoukankan      html  css  js  c++  java
  • 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)]
    浸水博客
  • 相关阅读:
    利用JNI技术在Android中调用、调试C++代码
    iOS在线更新framework,使用NSBundle动态读取
    CocoaPods pod install
    Quartz 2D在ios中的使用简述二:创建画布
    iOS并发编程笔记【转】
    openCV C++ 代码笔记
    Quartz 2D在ios中的使用简述一:坐标体系
    ios视频播放器,代码和界面分离
    mac显示和隐藏文件
    3点画圆
  • 原文地址:https://www.cnblogs.com/dipwater/p/2781156.html
Copyright © 2011-2022 走看看