Во-первых, я сейчас работаю на C#, и я читал об управлении памятью. До сих пор я прочитал несколько отличных ответов на переполнение стека, объясняя разницу между памятью стека и управляемой памятью кучи. В большинстве ответов указано, что, объявив:
int x = 5
, вы выделяете достаточно памяти для типа x
в памяти стека.
Я понимаю, как это работает, а также его объем, однако, когда я прочитал объяснение памяти кучи, это смутило меня.
Если вы говорите int x = 5
, поскольку int
является псевдонимом System.Int32
, не x
технически быть указателем на новый экземпляр System.Int32
структуры? И если да, то не будет ли он затем сохранен в памяти кучи, поскольку это используется для объектов типа.
В this учебнике говорится (для линии class1 cls1 = new class1()
): Является ли стек памяти только для указателей и кучи для объектов?
... создает указатель на стек и реальный объект сохраняется в другом типе ячейки памяти под названием «Heap».
По этой логике не все хранится в куче и только указатели, хранящиеся в стеке? Примеры быть новые экземпляры
System.String
,
System.Int64
,
System.Boolean
,
System.Decimal
и т.д.
Я думал, что я понял это, однако очевидно, я не делаю, так что я был бы признателен кто-то объяснял ли стек только для указателей или какая часть я неправильно , Заранее спасибо.
'System.Int32' - это структура, а не класс. Итак, * как локальный *, он, скорее всего, будет выделен в стеке. – vcsjones
Имейте в виду, что.NET CLR меняется, и линии между «выделенной кучей» и «выделенным стеком» продолжают становиться более сумасшедшими. – vcsjones
В этом учебнике сказано: «Время, когда оно попадает в новое ключевое слово, оно выделяется« кучей ».», И когда вы используете структуру (насколько мне известно), вы должны использовать новое ключевое слово. Вот почему я тоже смущен. – Nathangrad