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