Тип значения «выделяется» там, где он определен.
Что это означает, зависит от того, где вы его определяете:
- В классе / структуре, как поле в этой структуре, расширение класса / структуры в памяти, чтобы соответствовать значению типа значения там
- Как локальная переменная в методе, в стеке, или как регистр, или как поле в сгенерированном классе (при использовании "замыканий"), в зависимости от оптимизации
- В качестве параметра метода, в стеке или в регистре, в зависимости от оптимизации
Тип ссылки - это двойственное значение. Ссылочный тип в своей основе является указателем, и значение указателя следует тем же правилам «выделения», что и тип значения, но как только вы сохраняете в нем значение, т. Е. ссылка на объект, этот объект находится в куче где-то еще.
Другими словами, сама ссылочная переменная «выделяется» как тип значения, но объект, на который она ссылается, находится в куче.
Когда вы создаете объект из класса, в куче выделяется пространство для размещения всех полей этого класса + некоторые накладные расходы в этом пространстве.
Кажется, я вспомнил, что у Джона Скита была статья на эту тему, я уверен, что он очень скоро ответит, так что следите за обновлениями.