Типы значений в объекте, хранящемся в куче?

Я могу себе представить, что этот вопрос задавали тысячи раз, но мне не очень повезло найти ответ, плюс это больше из любопытства, чем нужно.

копаясь в гайках и болтах C#, мне было интересно, поскольку объекты хранятся в куче, являются ли типы значений внутри объектов, хранящихся в куче, или они помещены в стек?

4 ответов


Они хранятся в куче, внутри памяти, выделенной для ссылочного типа. Кроме того, типы значений часто хранятся в местах, отличных от "стека". Однако спецификация CLI не указывает, где находится пул памяти, в котором хранятся типы значений - это деталь реализации, которая не должна иметь значения.


Эндрю Хэйр прав. Для получения полной информации см. запись в блоге Эрика Липперта:

меня беспокоит миф о том, что "типы значений помещаются в стек" ... Обычно это указано неправильно: оператор должен быть "типы значений могут храниться в стеке", а не более распространенные"типы значений всегда хранятся в стеке".


Они хранятся в куче вместе с самими объектами. Хороший способ подумать об этом заключается в том, что когда объект (который имеет типы значений как часть своего состояния) выделяется в куче, его типы значений также должны жить там, иначе эти типы значений исчезнут, как только стек размотан для кода, который создал объект.


Да, они хранятся в куче. Тем не менее, это все детали реализации, как неоднократно описывал Эрик Липперт. Я предлагаю вам прочитать его сообщения в блоге об этом!--1-->этой будучи самым последним, и эти два также важно.