1 / 1 / 1
Регистрация: 14.10.2015
Сообщений: 94
|
|
1 | |
Стек и куча10.03.2018, 13:20. Показов 7831. Ответов 8
Метки нет (Все метки)
Всем привет. Только что вычитал из Tproger статью про стеки и кучи.
https://tproger.ru/translation... -and-heap/ Так вот там говорится, что стек в памяти он выделяется в начале работы программы и на этом все. То есть расширять его незя. А вот динамическая область памяти располагается в памяти как куча и создавать ее можно сколько угодно. Однако про C# вопрос такой. Ммм просто в моем понимании стек LIFO это лишь абстракция "последний вошел и первый вышел". И скажем, в куче я могу создать стек путем связного списка. И вот я хочу понять что имеет ввиду автор под названием "Стек". Если вы поняли можете привести банальные примеры и рассказать в чем я запутался скажем так.
0
|
10.03.2018, 13:20 | |
Ответы с готовыми решениями:
8
Классы, структуры, куча, стек Статика и динамика, стек и куча - что это Значимые и ссылочные типы. Куча и стек. И всем таким темам посвящается Стек, куча, хранение в памяти, динамическое выделение памяти, указатели в чем отличие? |
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
10.03.2018, 13:29 | 2 |
0
|
3457 / 2469 / 695
Регистрация: 02.08.2011
Сообщений: 6,690
|
|
10.03.2018, 13:41 | 3 |
Ermitash, да, это так, стек - то, что работает по принципу LIFO.
Однако, в статье речь идет про внутреннюю организацию памяти в современных управляемых приложениях (в .NET app например). Стек используется для хранения локальных переменных в приложении, а куча - основное хранилище, где хранятся используетмые на данный момент объекты. 1. При работе со значимыми типами переменные указывают на область памяти в стеке, где хранятся непосредственно данные. То есть, используя прямую адресацию, мы получаем данные. 2. При работе с ссылочными типами переменные указывают на область памяти в стеке, где хранятся ссылки (адреса объектов) на объекты в основном хранилище - куче. То есть, используя косвенную адресацию, мы получаем данные. Куча, в данном случае, просто какой-то рабочий кусок памяти, за которой наблюдает CLR (языковая среда).
1
|
1 / 1 / 1
Регистрация: 14.10.2015
Сообщений: 94
|
|
10.03.2018, 14:14 [ТС] | 4 |
IamRain, таак, то есть ты хочешь сказать, что при создании ссылочной переменной, ссылка идет в стек, а объект сам идет в кучу ( например класс). Однако, если взять тип значения, например struct, то она сразу вся пойдет в стек.
Теперь меня заинтересовал вопрос, Garbage Collector работает и с освобождением стека и с освобождением кучи? А в С++ насколько я понимаю есть освобождение памяти по типу значения, которые заносятся в стек, а вот переменные, которые в кучи ты должен удалять сам, верно?
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
10.03.2018, 15:02 | 5 |
Да, но только иногда.
Переменная значимого типа не обязательно будет храниться в стеке, как и переменная ссылочного типа. Нет, стек освобождается автоматически.
1
|
10.03.2018, 16:10 | 6 | ||||||||||
Да.
ReferenceType всегда(?) хранится на куче.
ValueType хранится на стеке всегда, за исключением тех случаев когда это массив или поле другого ReferenceType
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
10.03.2018, 18:55 | 7 |
Я про переменную.
Объект — да, но это не является частью спека языка. Компилятор имеет полное право размещать объект ссылочного типа в куче. Нет, не всегда. Например, если переменная захвачена анонимным методом или лямбдой, если переменная объявлена в блоке-итераторе, если она объявлена в асинхронном методе — она будет в куче;, если она размещена в регистре, то она тоже будет не в стеке. И так далее. Размещение переменной в куче, стеке или регистре зависит от времени ее жизни, а не от типа (иначе они бы назывались стековые и кучевые, а не ссылочные и значимые).
4
|
6 / 6 / 1
Регистрация: 28.09.2018
Сообщений: 396
|
|
10.05.2019, 11:04 | 8 |
Мне как человеку, желающему получить для начала общее представление, интересна иллюстрация (можно словесную; если можете хорошо) кучи и стека при методе, который вызывается несколько раз.
Где хранятся переменные метода, когда он не вызван? (напр.)
0
|
10.05.2019, 16:38 | 9 |
Когда метод не вызван, переменных метода не существует. Они создаются непосредственно при выполнении метода и уничтожаются по его завершении. Во время выполнения они создаются на стеке. Как видите, все просто
Далее, предполагается, что вы знаете о типах значения и ссылочных типах. Если нет, то забудьте пока о куче и перейдите по ссылке. Если да, то все, что вам остается познать - что все ссылочные переменные хранят данные в куче, а ссылки на них хранятся в стеке (как только на ссылочную переменную не останется ссылок, то она уничтожается). В принципе, все )
1
|
10.05.2019, 16:38 | |
10.05.2019, 16:38 | |
Помогаю со студенческими работами здесь
9
OscarLib куча ошибок 3-куча из двоичной кучи Куча Random и нормальное распределение Выскакивает куча окошек при DEBUG. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |