C# 调用C++DLL传递的bool型,返回混乱(c++为false,c#却为ture)

48 篇文章 1 订阅

感谢原作者:C# 调用C++DLL传递的bool型,返回混乱

原因:C++中bool占一个字节,C#中bool占4个字节

解决方法:将C++中的bool该为BOOL,或C#中的bool该为byte

原因:统一变量所占地址空间大小。C++中BOOL与C#中bool同样占用4个字节,C#中byte与C++中bool同样占用一个字节。

 

C++中定义如下结构体

struct MYSTRUCT

{

      int a;

      int b;

     float c;

      bool d;

}

sizeof(MYSTRUCT) == 16;  

sizeof(int)*2+sizeof(float)+sizeof(bool) ==13;

二者不相等:编译器会对结构体进行处理时,会进行字节对齐,以加快计算机取数速度。

字节对齐:max(max(sizeof(int),sizeof(float)),sizeof(bool)) == 4;sizeof(MYSTRUCT)应为4的整数倍取16;即:(13+(4-1))/4*4  ==16

若该为如下

struct MYSTRUCT

{

      int a;

      int b;

     float c;

      bool d;

      bool e;

}

sizeof(int)*2+sizeof(float)+sizeof(bool)*2 ==14;

sizeof(MYSTRUCT) == 16;即(14+(4-1))/4*4 == 16

同样若是如下结构体

struct MYSTRUCT

{

      double a;

      int b;

      bool e;

}

max(max(sizeof(double),sizeof(int)),sizeof(bool)) == 8;

sizeof(double)+sizeof(int)+sizeof(bool) == 13;

sizeof(MYSTRUCT) == (13+(8-1))/8*8 == 16;

 

 

C#中定义如下结构

struct MYSTRUCT

{

     public int a;

     public int b;

      public float c;

      public bool d;

}

Marshal.SizeOf(typeof(MYSTRUCT)) == 16;

与C++相同,但bool所占字节不同,

(MYSTRUCT)Marshal.PtrToStructure((IntPtr)((UInt32)ptrRsult), typeof(MYSTRUCT));

转换时可能导致混乱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值