Типы значений в объекте, хранящемся в куче?
Я могу себе представить, что этот вопрос задавали тысячи раз, но мне не очень повезло найти ответ, плюс это больше из любопытства, чем нужно.
копаясь в гайках и болтах C#, мне было интересно, поскольку объекты хранятся в куче, являются ли типы значений внутри объектов, хранящихся в куче, или они помещены в стек?
4 ответов
Они хранятся в куче, внутри памяти, выделенной для ссылочного типа. Кроме того, типы значений часто хранятся в местах, отличных от "стека". Однако спецификация CLI не указывает, где находится пул памяти, в котором хранятся типы значений - это деталь реализации, которая не должна иметь значения.
Эндрю Хэйр прав. Для получения полной информации см. запись в блоге Эрика Липперта:
меня беспокоит миф о том, что "типы значений помещаются в стек" ... Обычно это указано неправильно: оператор должен быть "типы значений могут храниться в стеке", а не более распространенные"типы значений всегда хранятся в стеке".
Они хранятся в куче вместе с самими объектами. Хороший способ подумать об этом заключается в том, что когда объект (который имеет типы значений как часть своего состояния) выделяется в куче, его типы значений также должны жить там, иначе эти типы значений исчезнут, как только стек размотан для кода, который создал объект.