18143453325 在线咨询 在线咨询
18143453325 在线咨询
所在位置: 首页 > 营销资讯 > 行业动态 > 坑一:sizeof(bool) = ?

坑一:sizeof(bool) = ?

时间:2022-04-28 21:03:01 | 来源:行业动态

时间:2022-04-28 21:03:01 来源:行业动态

绝大多数的基本类型属于Blittable Types8:如System.Byte, System.Single等。System.Boolean虽然不属于Blittable types,但是Standard Marshalling Service默认将其转换为1,2,4字节的内存存储,当其值为true时,其对应的值为1。如果你想当然的直接将System.Boolean映射到Unmanaged侧的bool类型而不做特别处理的话,你并一定会理解碰到编译或者运行时错误,但是如果你严格的测试每个字段是,会惊讶的发现这些bool值跟你想象的不尽相同:有时正确,有时错误。

经过调试跟踪,动态打印sizeof(bool)来确认Unmanaged侧bool类型数据长度后,你会发现System.Boolean默认会被保存为4个字节长度,而在macOS环境下(对于其它环境,需要自行认证),C 定义的bool其实只有一个字节。因此当你在Unmanaged侧取bool值的时候,其实只读取了System.Boolean的1/4个字节而已。而当你声明了多个连续的System.Boolean/bool值时,可能在Unmanaged侧读取的这几个bool值仅仅是第一个System.Boolean值的不同偏移字节而已。

知道了原因,解决方案自然就出来了,在Managed侧强制声明System.Boolean字段封送到Unmanaged侧时仅使用一个字节:

[MarshallAs(UnmanagedType.U1)]publicboolTrueOrFalse;

关键词:

74
73
25
news

版权所有© 亿企邦 1997-2022 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭