Простой ответ на ваш вопрос - нет, такого API нет.Большинство современных ГХ спроектированы с учетом «гипотезы поколений», что большинство объектов умирают молодыми или живут долго.То, что вы описываете, обычно называют «кризисом среднего возраста» - объекты, живущие достаточно долго, чтобы перейти в старшее поколение, но сразу же больше не нужны.Это, очевидно, далеко не оптимально для современных ГХ.Распространенный способ избежать этого состоит в том, чтобы: уменьшить распределение (меньше шансов быть продвинутым, поэтому мы часто остаемся в части "умри молодым") или повторно использовать объекты (таким образом мы приземляемся в части "живи долго").
Byмногократно используя структуры и ссылки, вы выбрали первый подход.Вы также можете подумать о повторном использовании объектов путем объединения, например ArrayPool<T>
или других.
Что касается вопросов, вы предлагаете API для:
"сборщика мусора, который может ответить перемещениемobject to the gen 0 heap "
Несмотря на то, что он сильно затрагивает возможные детали реализации, вряд ли можно реализовать его эффективно.Многие GC, в том числе .NET, стараются изо всех сил не копировать / перемещать память.Поколения - это просто логические области памяти, границы которых перемещаются взад и вперед.Таким образом, «перемещение объекта в gen0» потребует его копирования (и, возможно, всего его сохраненного графа, чтобы сделать его разумным), что приведет к накладным расходам, значительно превышающим потенциальную выгоду.Хуже того, в настоящее время это может быть сделано только во время GC, так как у нас не реализовано одновременное сжатие (в общем, перемещение объектов во время их использования).
"Как я понимаю, платформа .NETплохо оптимизирован для любых структур, кроме небольшого числа байтов (официальные источники говорят 16, хотя я слышал 24), а также для изменяемых структур "
Это выглядит как небольшая ложь.Среда выполнения .NET значительно оптимизирует использование структур, и если вы передаете их по ref
, это один из наиболее эффективных подходов, которые я могу придумать.Просто знайте только о ловушке защитного копирования , с которой вы можете столкнуться при использовании in
параметров.