Как массивы создаются и доступны - PullRequest
1 голос
/ 17 октября 2011

Я понимаю (хотя и не полностью, почему), что экземпляры примитивных типов, таких как int, float, хранятся в стеке и не выделяются в куче. Но я немного озадачен тем, как массивы примитивных типов хранятся и доступны. У меня есть этот вопрос, потому что System.Array является ссылочным типом. И ссылочные типы выделяются кучей.

int[] integers = {1,2,3,4,5};

Как эти отдельные целые числа хранятся и доступны в памяти?

Ответы [ 4 ]

10 голосов
/ 17 октября 2011

Вы обнаружили причину, по которой утверждение «типы значений всегда хранятся в стеке» явно неверно.Правда в том, что тип хранимого объекта не имеет отношения к тому, где он хранится .Правильным правилом является то, что значения с коротким временем жизни хранятся в хранилище из краткосрочного «стека» , а значения с большим временем жизни хранятся в хранилище из долгосрочного «кучи» .

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

Содержимое массива int потенциально потенциально долговечно, поэтому он выделяется.из долгосрочного магазина.Содержимое локальной переменной типа int обычно недолговечно, поэтому оно обычно выделяется из недолговечного хранилища.

10 голосов
/ 17 октября 2011

Ваше "понимание" в принципе неверно.Значения типа значения иногда хранятся в стеке, но не в части массива или любого другого объекта на основе кучи.К сожалению, некоторые люди предпочитают делать такое общее утверждение вокруг типов значений, находящихся в стеке, что затем сбивает с толку других: (

Кроме того, различие стека / кучи - это деталь реализации ...

См. мою статью о памяти для получения более подробной информации, но определенно прочитайте сообщение в блоге Эрика Липперта (ссылка в предыдущем абзаце) для более философских соображений. (Прочтите другие сообщения о типах значений для получения дополнительной информации.)

1 голос
/ 17 октября 2011

Эта статья Джеффри Рихтера, написанная в 2002 году, очень ясно объясняет эту концепцию.

1 голос
/ 17 октября 2011

Массив сам по себе всегда является ссылочным типом, поэтому он хранится в куче.Элементы массива также хранятся в куче, но всегда в непрерывном блоке памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...