数组大小调整是否会调用GC?

时间:2010-09-02 17:34:40

标签: c# .net arrays garbage-collection xna

我查看了Array.Resize()的实现,发现创建并返回了一个新数组。我的目标是在游戏过程中零内存分配,所以我需要避免创建任何新的引用类型。调整数组大小会触发前一个数组上的垃圾收集器吗?我正在创建自己的2D数组缩放器,但它的基本功能与.NET Resize()方法相同。

如果新数组小于前一个数组,但多余的对象已经放回到通用对象池中,这会调用GC吗?

我的游戏循环中将不断创建数组,因此我需要尽量使其尽可能高效。我正在尝试创建一个array pool,这样就不需要继续创建它们了。但是,如果resize方法执行相同的操作,那么不仅仅实例化一个新数组而不是使用该池也没有意义。

感谢您的帮助

4 个答案:

答案 0 :(得分:13)

Array.Resize实际上根本没有改变原始数组 - 任何仍然引用它的人都可以像以前一样使用它。因此,没有可能的优化。坦率地说,这是一个命名不好的方法,IMO :(

来自docs

  

此方法使用分配新数组   指定的大小,复制元素   从旧阵列到新阵列,和   然后用。替换旧数组   新的。

所以不,它不会重复使用原始内存或类似的东西。它只是创建一个不同大小的浅拷贝。

答案 1 :(得分:2)

是的,使用Array.Resize会导致分配一个新数组并最终收集旧数组(除非在某处仍有对它的引用)。

更低级别的数组调整器在某些情况下可能会进行一些小的优化(例如,当阵列变得更小或者阵列之后恰好有内存可用时),但是.NET的实现不做这一点。

答案 2 :(得分:1)

隐含的是。

明确没有。

答案 3 :(得分:1)

当没有更多参考文献时,GC最终会清除任何分配,所以是的。

如果您想避免调整阵列大小,那么您可以做的最好的事情就是预先分配足够大的大小以避免重新分配。在这种情况下,您也可以只使用具有在构造函数中指定的初始容量的集合类,例如List。