Непрерывная память, хранящая недоразумения в .net? - PullRequest
8 голосов
/ 08 февраля 2012

http://msdn.microsoft.com/en-us/library/ms379570(v=vs.80).aspx

Я знаю, что Arrays в .net хранится непрерывным способом. (в памяти)

Я также знаю, что List<..> нет. (ну ... не все типы списков ... см. мой второй вопрос)

Отсюда у меня 2 предложения


  1. Я знаю, что после 4,8,16 ... вставлены элементы в список - сам список reallocate в памяти.

    Я также знаю, что могу отправить ему Capacity в ктор, чтобы сообщить ему, в каком размере я собираюсь его создать (чтобы уменьшить перераспределение).

    Вопрос почему ? он НЕ хранит себя непрерывно, так почему он заботится о выделять себя? (ему не нужно искать свободные и смежные ячейки памяти)

  2. Почему List со структурами размещается в смежной памяти, в отличие от List классов?

Ответы [ 2 ]

21 голосов
/ 08 февраля 2012

List<T> сохраняет память непрерывно. Внутренне он использует массив для хранения. Когда вы достигаете емкости, выделяется новый массив и копируется память.

Это верно для List<T> экземпляров классов или структур. Однако, когда T является ссылочным типом (классом), вы сохраняете непрерывный список ссылок . Экземпляры класса не могут быть смежными, так как вы можете включить список, который содержит 100 ссылок на того же экземпляра класса.

Для ответа на ваши конкретные вопросы:

Вопрос в том, почему? он НЕ хранит себя непрерывно, так почему он заботится о перераспределении себя?

хранит элементы непрерывно, поэтому требуется перераспределение.

почему List со структурами размещается в смежной памяти, в отличие от List классов?

Оба хранятся смежно, но во втором случае (классы) вы храните список ссылок на экземпляр класса.

0 голосов
/ 08 февраля 2012

1) все объекты ссылки по-прежнему хранятся непрерывно

2) список och классов по-прежнему должен позволять сохранять объекты как обычные объекты.их нельзя втиснуть в константный массив - но ссылки на них могут

...