Как массивы создаются и доступны

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

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам