2015-09-05 6 views
9

Я довольно новичок в проблеме с памятью. Надеюсь, вы не думаете, что это глупый вопрос.C# Большой объект в коллекции среднего размера

Я знаю, что память больше, чем 85000 байт будет введен в LOH в C# т.е.

Byte[] hugeByteCollection = new Byte[85000]; 

Я интересно, если это коллекция с размером 10000 - 20000 с объектом, который содержит 10 переменных-членов (байт тип) будет помещен в LOH или SOH?

ответ

4

Размер массива объектов - это количество объектов, умноженное на размер указателя. Это связано с тем, что в самом массиве хранятся только типы значений, ссылочные типы (объекты) будут храниться где-то еще и не будут учитываться в размере массива. Таким образом, 85000/4 = 21250 объектов и 85000/8 = 10625 объектов могут храниться в массиве на SOH в 32-битном и 64-битном режимах соответственно.

Редактировать: Спасибо Hans Passant за то, что это предполагает, что тип коллекции используется как массив, а не список. Списки изменяют размеры, чтобы быть больше, чем содержание, чтобы избежать слишком большого количества распределений. См. this link для получения более подробной информации.

+1

Такая математика не работает для типов сбора, это на самом деле 16,384. Проверьте [этот ответ] (http://stackoverflow.com/a/2248188/17034). –

+0

Спасибо за ваш комментарий! Изменение размера, о котором вы говорите, относится только к спискам, а не к массивам, поэтому напрямую не связано с этим вопросом. Но все же я должен был добавить предупреждение –

+0

, чтобы сохранить список в SOH для списка, который содержит большое количество объектов. Нам нужно создать секционированный список, содержащий массив списка. РазделList будет динамически создавать новый список и добавляться в arry, когда список превышает емкость 10000 Будет ли это работать? – cscmh99