Наброс про abstract struct довольно быстро потонул, видимо надобно что-то поближе к функциональщине.
Например, поддержка tagged union со стороны рантайма! (Не полноценные sum type, Either<A,A,B> и Either<B,A> - разные типы. но все ж)
Если их ручками реализовывать, то натыкаешься либо на аллокации, либо на жирненькость.
Имплементация должна содержать индекс реального значения (tag) и множество возможных значений, из которых задано только одно (вот отсюда возникает оверхед по используемой памяти)
- Если имплементирован как value-тип, то передавать его дорого, приходится возиться с ref return и ref/out параметрами
- Если имплементирован как reference-тип, то место передавать дешево, но нужно сделать аллокацию, да и в куче место отожрет
Можно попробовать уменьшить занимаемое место, как-то сделав overlap участков памяти под конкретные значения:
- В tagged union одно поле object под все значения, а по индексу уже определяем, что за конкретный тип. Постоянный боксинг/анбоксинг и тайпчеки!
- Включаем байтоебство, и FieldOffset'ами записываем все значения по одному смещению, и по индексу вытаскиваем конкретные байтики. Все хорошо пока все значения или только value-типы или только reference-типы. Как только натыкаемся на оба получаем E-E-Exception! Нельзя оверлапить ссылки и данные, для GC нужно обязательно гарантировать, что в этом участке памяти ссылка в кучу может быть либо всегда, либо никогда!
То бишь для стройного быстрого tagged union нужна реализация со стороны рантайма, и что б GC знал, что надо индекс проверять перед тем как ссылки переписывать.
Что думаете? Где возникнут type holes, GC holes, etc?