Как реализован IEnumerator.ToArray ()? - PullRequest
0 голосов
/ 20 марта 2020

Для IEnumerator.ToList() Кажется очевидным, что он будет повторяться MoveNext(), Add(Current), пока не достигнет конца.

Но для массива я не вижу каких-либо умных способов сделать Это. Не зная счетчика IEnumerator, он будет снова и снова создавать массив, увеличивая его длину на 1 с MoveNext(), пока не достигнет конца. И это определенно не так, я уверен в этом.

Как ToArray() реализовано внутри?

1 Ответ

4 голосов
/ 20 марта 2020

Маги c на самом деле не существует, и результирующий буфер растет так же, как List<T> (точный код зависит от используемой вами среды и какой версии), однако это все еще одни и те же.

  1. Размер буфера будет начинаться с размера 4 и будет увеличиваться в два раза каждый раз, когда ему потребуется емкость. Например, 8, 16, 32, 64, ...

  2. Каждый раз, когда он увеличивается, он использует быструю копию mem (стиль) для передачи данных.

  3. Окончательный результат выделит и копию для нужного размера.

Да, есть выделений , и чем больше перечисленный результат, тем больше выделений будет работать, хотя даже в худшем случае они будут минимальный.

Примечание : Если вы хотите уменьшить выделения в вашем коде, то лучше держаться подальше от растущих буферов и магических зверей, которые их вызывают

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...