游戏
当前位置:游戏 > 新闻快报 > 国内游戏新闻 >

环信IM Unity SDK 2.0正式发布 大大提升开发效率 (4)

环信IM Unity SDK 2.0正式发布 大大提升开发效率 (4)
2021-08-25 15:33:09

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

[MarshallAs(UnmanagedType.U1)]public bool TrueOrFalse;

坑二:字节对齐

对于C++开发者来说,可能知道当一个数据结构(class or struct)中的各字段在内存中进行排列时,会按照一个设定的装箱长度进行字节对齐,例如:

struct MyStruct { int one; short two; int three; bool four;}

假设在我们的平台上,sizeof(int)=4, sizeof(short)=2, sizeof(bool)=1, 如果问你sizeof(MyStruct)=?,你可能会马上做个加法得到答案,但是答案不一定对。It depends! 假设我们是按照4个字节对齐,这上面的结构体在内存中实际排列如下图:

环信IM Unity SDK 2.0正式发布 大大提升开发效率

了解这个对于我们编码有两个意义:

1、通过合理排列字段声明顺序来优化存储效率,内存布局中不留空洞;

2、MarshalAsAttribute支持Layout.Explicit来进行绝对定位,懂得了字节对齐可以配合Unmanaged侧的内存排列规则以保证字段长度映射正确,不然同样会发生字段长度不一致带来的困扰。

坑三:如何避免Double Free

Standard Marshalling Service/Interop marshaller总是试图释放Unmanaged侧代码分配的内存9,这会带来Double Free的问题,如果碰到这种问题,程序就会直接崩溃。

引用资料中举了以下例子:

BSTR MethodOne (BSTR b) { return b; }

如果这段代码直接从Unmanaged侧DLL中直接执行,不会发生任何额外的内存释放;但是当你从Managed侧调用这个方法时,b会被释放两次。

而更让人抓狂的是,并没有相应的信息提示究竟是哪个指针,哪个字段被DoubleFree了,你唯一能做的就是一点点加代码来验证自己猜测。所以,严格来说,并没有一个万无一失的方案来避免DoubleFree,你唯一能做的就是通过测试来验证结果(有点盲拧魔方的味道了)。

关键词:

相关报道:

    关闭
     

    网易暴雪游戏运营团队辟谣:国服数据丢失等均为谣言!

    24-04-30 10:29:05网易暴雪游戏运营团队辟谣

    《艾尔登法环:黄金树之影》新视觉图公开!

    24-04-28 11:24:56艾尔登法环,黄金树之影

    《命运2》宣布取消“武器日落”政策,老武器全面回归

    24-04-26 14:05:25命运2,武器日落,老武器全面回归,终焉之形

    《关于我转生变成史莱姆这档事 坦派斯特开拓谭》Steam页面上线 8月8日发售

    24-04-26 14:03:32关于我转生变成史莱姆这档事 坦派斯特开拓谭

    讯飞星火大模型V3.5春季上新 V4.0 将于6月27日发布!

    24-04-26 14:02:01讯飞星火大模型,讯飞星火

    百度:AI专利申请量、授权量国内第一!

    24-04-26 13:59:45百度,AI专利,国内第一

    《盖瑞的模组》应任天堂要求清除侵权Mod!

    24-04-26 13:52:25盖瑞的模组,删除任天堂相关Mod