Другие языки программирования и технологии

Где размещаются статические переменные программы?

Как известно, динамические переменные (а точнее их значения) размещаются в куче во время выполнения программы. А где размещаются статические данные? И можно ли освободить память, занимаемую статическими данными? Что-то в вики не нашёл статьи на эту тему.
Когда программа стартует то для нее выделяется место в оперативной памяти. Оно известно как "адресное пространство процесса" и состоит из трех участков, называемых: сегмент кода, сегмент данных и сегмент стека. Сегмент кода содержит саму программу, исполняемый код, который будет выполняться инструкция за инструкцией. Сегмент стека хранит временные (локальные или автоматические) переменные и адреса возврата всех процедур. При входе в процедуру на верхушку стека кладется адрес возврата и выделяется (автоматически) нужное количество байт под локальные переменные, а при выходе из процедуры соответствующее число байт с верхушки стека снимается (тоже автоматически). Вот почему после окончания работы процедуры нельзя обратиться к ее локальным переменным. Память под сегмент данных выделяется при старте программы и ее размер не может быть изменен во время выполнения. Сегмент данных предназначен для размещения переменных, которые будут существовать в течении всего времени выполнения программы и к которым можно обратиться из любой точки программы. Из-за этих особенностей эти переменные называются статическими или глобальными. Но есть еще одна разновидность переменных, размер которых становится известным только после запуска программы. Память для них выделяется в куче (участок свободной памяти) и они называются динамическими. Доступ к этим переменным осуществляется через указатели или ссылки. Память выделенная динамически может быть освобождена в любой момент.

В общем примерно так. Более подробно об этом всем вы может прочитать в любой хорошей книге по ассемблеру.
Винер Закиров
Винер Закиров
2 365
Лучший ответ
Павел Васильев Спасибо. Да, пора спускаться на нижний уровень.
Освободить память можно только после того как вы её выделите. Под статические переменные память не выделяется динамически, а следовательно и освободить её невозможно. Смотрите к привязке вашего языка программирования тему - Область видимости и время жизни статических типов.
Han Mamay Мамаев
Han Mamay Мамаев
86 524
Размещаются в памяти, которая выделяется один раз при старте программы. Для константных значений вообще часть файла может напрямую в оперативку маппиться.
Переменные освобождаться в принципе не могут. Максимум упадут в swap.
Константы могут быть вытеснены из оперативки. При необходимости будут подняты из файла.
Но это всё на усмотрение операционной системы
Павел Васильев Т. е. можно не заботиться о памяти, которую занимают статические переменные? Всё равно эта память не будет доступна другим процессам?
вот здесь вроде все доступно описано
https://msdn.microsoft.com/ru-ru/library/s1sb61xd.aspx
Павел Васильев Не, это другое. Там про классы памяти написано. А я имею в виду все статические переменные.
Нихрена это не "как известно"))

в каждом языке своё.
Базово под статическоие память выделяется на процессе компиляции. а под динамические по ходу исполнения.
Но там тыщи нюансов зависящих от языка и среды.
Уточняй об чём вопрос))
***** Z *****
***** Z *****
27 060
Павел Васильев В чистом С, например)
Кстати, вот не могу понять эту фразу "выделяется на процессе компиляции".
Она и в википедии мне встретилась.
Как вообще в процессе компиляции может выделяться память. Компиляция - это процесс перевода, а не исполнения программы.
Любое выделение памяти происходит во время выполнения программы.
Разве не так?
простые переменные размещаются в стеке, как только переменная выходит из области видимости - переменная вылазиет из стека, освободить не получится, вылезет екзепшн, что мол низя очистить рид онли память
Азамат Жумаев
Азамат Жумаев
8 401