@footballer

Почему в var a = new int[1] {5} нет упаковки?

Говорят, что упаковка - тяжелая операция из-за того, что структура копируется из стека в кучу.
В качестве примера упаковки приводят такой код:
var a = new object[1] {5};
то есть когда мы int помещаем в массив object-ов.
Но ведь даже если мы создаем массив int-ов так:
var a = new int[1] {5} ;
то все-равно наш int 5 должен скопироваться в кучу, т.к. память под массив выделяется в куче. Но почему в этом случае не считается, что это не упаковка, и считается, что это не тяжелая операция?
  • Вопрос задан
  • 123 просмотра
Пригласить эксперта
Ответы на вопрос 1
@kttotto
пофиг на чем писать
Я, думаю, Вы что-то не так поняли. Массив, это ссылочный тип и в случае
var a = new int[1] {5}
значение переменной a будет лежать в стеке, но значением будет ссылка на место в куче, указывающая на массив интов. Тоже самое касается и
a = new object[1] {5}

Упаковка будет происходить со значениями, которые лежат в стеке, а потом копируются в кучу. Например так
int a = 5;
var b = (object)a;

В первой строке мы положили в стек пятерку, а во второй эту пятерку мы помещаем в кучу. Переменная b будет лежать в стеке, значение которой будет указывать на адрес в куче, где лежит тип object, со значением value равным 5. И то, что у объекта поле будет интовое, не означает, что оно будет в стеке.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы