Типы значений в объекте также хранятся в куче? - PullRequest
6 голосов
/ 18 января 2011

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

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

Ответы [ 4 ]

9 голосов
/ 18 января 2011

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

. Меня беспокоит миф о том, что «типы значений идут в стек» ... Это обычно неверно: оператор должен быть «типы значений могут храниться в стеке», вместо более распространенного «типы значений всегда хранятся в стеке».

6 голосов
/ 18 января 2011

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

4 голосов
/ 18 января 2011

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

1 голос
/ 18 января 2011

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

...