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

先说结论: 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

你可能感兴趣的:(using方法可能产生GC Alloc的原因总结 Unity)