找回密码
 立即注册
查看: 361|回复: 0

using方法可能产生GC Alloc的原因总结 Unity

[复制链接]
发表于 2022-3-27 19:39 | 显示全部楼层 |阅读模式
先说结论: List和字典的Enumerator是值类型,创建时就不会在堆上分配,而是由调用这个Dispose,要转换为IDisposable接口(由值类型对象转化为接口类型的对象)导致的;而用foreach遍历ArrayList产生GC Alloc的起因就不一样,因为ArrayList的Enumerator是引用类型,创建时自然会在堆上分配。

再说原因:

从IL代码来看,在finally里调用了Dispose:

using等价于try-finally,在finally里调用了Dispose,这也是foreach遍历List和字典产生GC Alloc的起因,由于List和字典的Enumerator是个值类型,为了调用这个Dispose,要转换为IDisposable接口(由值类型对象转化为接口类型的对象)会导致装箱操作。

另外,原生的C#代码是不需要手动调用Dispose方法清理的,GC会统一回收。至于foreach的实现原来为啥要那么写,应该也是生成GC Alloc这个bug的原因吧。

————————————————

版权声明:本文为CSDN博主「Real_JumpChen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/BillCYJ/article/details/81814355
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-17 04:43 , Processed in 0.089067 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表