实验环境:
- Unity 5.4.6f3 (64-bit)
- Editor下(非真机,数据会有差异)
内存分配量记录
1. 不使用闭包的委托:104B
- 由于没有用到upvalue,编译器会创建一个静态对象,内存只分配一次。
- 如果有用到upvalue,那么每次传递这个委托都会产生内存分配。
2. 返回IEnumerator、IEnumerable的函数调用:32B
- 每次调用都会分配内存,与使用方式无关[foreach,while(itor.MoveNext()) 都有分配]
- 猜测分配原因:调用后会返回一个用于迭代的对象,这个对象占用了内存
注意事项
1. 不要对GetEnumerator使用using
对于一个Dictionary类型,使用下面的方式遍历可以避免foreach产生的额外内存分配:
var itor = dict.GetEnumerator();
while (itor.MoveNext()) ;
但是这么写VS会给一个波浪线提示:Instance of IEnumerator is never disposed,使用using包起来后就没有提示了。但是using包Enumerator后会产生额外的堆内存,其原因和foreach相似。
using (var itor = dict.GetEnumerator())
{
while (itor.MoveNext()) ;
}
Enumerator本身是struct不会产生堆内存,但Dispose()方法是IDisposable的接口,在using的时候值类型->引用类型产生了装箱操作。