Изменение размера массива вызывает GC? - PullRequest
9 голосов
/ 02 сентября 2010

Я посмотрел на реализацию Array.Resize () и заметил, что новый массив создан и возвращен.Я стремлюсь к нулевому распределению памяти во время игры, и поэтому мне нужно избегать создания каких-либо новых типов ссылок.Вызывает ли изменение размера массива сборщик мусора в предыдущем массиве?Я создаю свой собственный 2D Resizer Resizer, но он по сути работает так же, как метод .NET Resize().

Если новый массив меньше, чем предыдущий, но лишние объекты уже былиПомещенный обратно в общий пул объектов, будет ли это вызывать GC?

В моем игровом цикле будут постоянно создаваться массивы, поэтому мне нужно постараться сделать его максимально эффективным.Я пытаюсь создать array pool как таковой, чтобы не было необходимости создавать их в игре.Однако, если метод resize делает то же самое, то не имеет смысла не просто создавать новый массив вместо пула.

Спасибо за помощь

Ответы [ 4 ]

13 голосов
/ 02 сентября 2010

Array.Resize фактически не меняет исходный массив - любой, у кого еще есть ссылка на него, сможет использовать его, как и раньше.Поэтому оптимизация невозможна.Честно говоря, это метод с плохим именем, IMO: (

Из документов :

Этот метод выделяет новый массив с указанным размером, копирует элементы изстарый массив на новый, а затем заменяет старый массив новым.

Так что нет, он не собирается повторно использовать исходную память или что-то в этом роде. Он просто создает поверхностную копию сдругой размер.

2 голосов
/ 02 сентября 2010

Да, использование Array.Resize приводит к выделению нового массива и, в конечном счете, к сбору старого массива (если на него еще нет ссылок).

Возможно, может использоваться более низкоуровневый преобразователь массивав некоторых случаях выполняйте небольшую оптимизацию (например, когда массив уменьшается или сразу после массива становится доступной память), но реализация .NET этого не делает.

1 голос
/ 02 сентября 2010

Любое распределение будет в конечном итоге очищено GC, когда больше нет ссылок, так что да.

Если вы хотите избежать изменения размеров ваших массивов, лучшее, что вы можете сделать, - это предварительно выделить их с достаточно большим размером, чтобы вообще не перераспределять. В этом случае вы также можете просто использовать класс коллекции с начальной емкостью, указанной в конструкторе, например List.

1 голос
/ 02 сентября 2010

Неявно да.

№ явно.

...