Объекты в эфемерном сегменте (SOH; куча небольших объектов) размещаются после последнего известного объекта в этом сегменте.Это должно быть просто указатель на это.
«Пустое» пространство между ними не будет рассматриваться, поскольку пустого пространства нет.Даже если у объекта больше нет ссылки, он все равно будет там, пока не будет собран мусор.Затем SOH будет сжат, поэтому опять нет свободных мест.
Если SOH недостаточно велик, то нужно выбрать другой или создать новый сегмент.Это займет больше времени, но все еще равно O (1).
LOH немного сложнее, так как обычно он не уплотняется.Существуют веб-сайты, которые заявляют, что у LOH есть «свободный список».Но я не уверен, действительно ли это реализация стиля списка.Я думаю, что он имеет лучшее управление и работает как словарь, поэтому он не должен быть хуже, чем O (log (n)).
Что нужно сделать?
- возможно получить новую память из ядра.Если это так, память уже была обнулена и memset () не требуется.
- , если эта новая память недоступна в ОЗУ, сначала замените что-либо на диск.Эта часть может стать очень дорогой, но непредсказуемой.
- Если память уже доступна в .NET, возможно, ее нужно инициализировать нулем.Но реализация memset () оптимизирована (например, с использованием
rep stos
) - Инициализировать массив значениями откуда-то (например, из файла).Скорее всего, это будет цикл .NET, за исключением замены одной из дорогих частей.
Обычно я бы не стал беспокоиться о выделении памяти, если бы вы не использовали профилировщик (например,dotMemory), который рассказал вам о проблемах пропускной способности памяти.Доверьтесь Дональду Кнуту: «преждевременная оптимизация - корень всего зла».