代码之家  ›  专栏  ›  技术社区  ›  keyboardP

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

  •  9
  • keyboardP  · 技术社区  · 14 年前

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

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

    数组将不断地在我的游戏循环中创建,所以我需要尽可能地提高效率。我想创造一个 array pool 因此,没有必要在我身上继续创造它们。但是,如果resize方法做同样的事情,那么不只是实例化一个新数组而不是拥有池就没有什么意义了。

    谢谢你的帮助

    4 回复  |  直到 14 年前
        1
  •  13
  •   Jon Skeet    14 年前

    Array.Resize 实际上根本不会更改原始数组-任何仍然有对它的引用的人都可以像以前一样使用它。因此不可能进行优化。坦白地说,这是一个名字不好的方法,我想:(

    docs :

    此方法使用 从旧阵列到新阵列,以及 然后用 新的。

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

        2
  •  2
  •   Matti Virkkunen    14 年前

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

    在某些情况下(例如,当数组变小或数组后面正好有可用的内存时),一个更低级的数组大小调整器可能会做一些小的优化,但是.NET的实现并不能做到这一点。

        3
  •  1
  •   Andrew Lewis    14 年前

    含蓄地说是的。

        4
  •  1
  •   user438034 user438034    14 年前

    如果要避免调整数组的大小,最好的方法是预先分配足够大的大小,以避免重新分配。在这种情况下,您最好只使用一个具有构造函数中指定的初始容量的集合类,例如List。