Другие языки программирования и технологии
Где размещаются статические переменные программы?
Как известно, динамические переменные (а точнее их значения) размещаются в куче во время выполнения программы. А где размещаются статические данные? И можно ли освободить память, занимаемую статическими данными? Что-то в вики не нашёл статьи на эту тему.
Когда программа стартует то для нее выделяется место в оперативной памяти. Оно известно как "адресное пространство процесса" и состоит из трех участков, называемых: сегмент кода, сегмент данных и сегмент стека. Сегмент кода содержит саму программу, исполняемый код, который будет выполняться инструкция за инструкцией. Сегмент стека хранит временные (локальные или автоматические) переменные и адреса возврата всех процедур. При входе в процедуру на верхушку стека кладется адрес возврата и выделяется (автоматически) нужное количество байт под локальные переменные, а при выходе из процедуры соответствующее число байт с верхушки стека снимается (тоже автоматически). Вот почему после окончания работы процедуры нельзя обратиться к ее локальным переменным. Память под сегмент данных выделяется при старте программы и ее размер не может быть изменен во время выполнения. Сегмент данных предназначен для размещения переменных, которые будут существовать в течении всего времени выполнения программы и к которым можно обратиться из любой точки программы. Из-за этих особенностей эти переменные называются статическими или глобальными. Но есть еще одна разновидность переменных, размер которых становится известным только после запуска программы. Память для них выделяется в куче (участок свободной памяти) и они называются динамическими. Доступ к этим переменным осуществляется через указатели или ссылки. Память выделенная динамически может быть освобождена в любой момент.
В общем примерно так. Более подробно об этом всем вы может прочитать в любой хорошей книге по ассемблеру.
В общем примерно так. Более подробно об этом всем вы может прочитать в любой хорошей книге по ассемблеру.
Павел Васильев
Спасибо. Да, пора спускаться на нижний уровень.
Освободить память можно только после того как вы её выделите. Под статические переменные память не выделяется динамически, а следовательно и освободить её невозможно. Смотрите к привязке вашего языка программирования тему - Область видимости и время жизни статических типов.
Размещаются в памяти, которая выделяется один раз при старте программы. Для константных значений вообще часть файла может напрямую в оперативку маппиться.
Переменные освобождаться в принципе не могут. Максимум упадут в swap.
Константы могут быть вытеснены из оперативки. При необходимости будут подняты из файла.
Но это всё на усмотрение операционной системы
Переменные освобождаться в принципе не могут. Максимум упадут в swap.
Константы могут быть вытеснены из оперативки. При необходимости будут подняты из файла.
Но это всё на усмотрение операционной системы
Павел Васильев
Т. е. можно не заботиться о памяти, которую занимают статические переменные? Всё равно эта память не будет доступна другим процессам?
вот здесь вроде все доступно описано
https://msdn.microsoft.com/ru-ru/library/s1sb61xd.aspx
https://msdn.microsoft.com/ru-ru/library/s1sb61xd.aspx
Павел Васильев
Не, это другое. Там про классы памяти написано. А я имею в виду все статические переменные.
Нихрена это не "как известно"))
в каждом языке своё.
Базово под статическоие память выделяется на процессе компиляции. а под динамические по ходу исполнения.
Но там тыщи нюансов зависящих от языка и среды.
Уточняй об чём вопрос))
в каждом языке своё.
Базово под статическоие память выделяется на процессе компиляции. а под динамические по ходу исполнения.
Но там тыщи нюансов зависящих от языка и среды.
Уточняй об чём вопрос))
Павел Васильев
В чистом С, например)
Кстати, вот не могу понять эту фразу "выделяется на процессе компиляции".
Она и в википедии мне встретилась.
Как вообще в процессе компиляции может выделяться память. Компиляция - это процесс перевода, а не исполнения программы.
Любое выделение памяти происходит во время выполнения программы.
Разве не так?
Кстати, вот не могу понять эту фразу "выделяется на процессе компиляции".
Она и в википедии мне встретилась.
Как вообще в процессе компиляции может выделяться память. Компиляция - это процесс перевода, а не исполнения программы.
Любое выделение памяти происходит во время выполнения программы.
Разве не так?
простые переменные размещаются в стеке, как только переменная выходит из области видимости - переменная вылазиет из стека, освободить не получится, вылезет екзепшн, что мол низя очистить рид онли память
Похожие вопросы
- С++ Наследование и статические переменные
- VisualC++ 2010. При выборе MFC - статической библиотеки программа не компилируется.
- Вычислить сумму нечетных элементов в программа С++ .Через статический и динамический массив! Вот я сам написал проверьте
- Помогите с заданием по написанию программы на языке ассемблер, вычисляющую значение переменной R.
- Нужна программа на языке ассемблер, вычисляющую значение переменной R.
- Нужна программа на языке ассемблер, вычисляющую значение переменной R.
- Чем отличаются статические и глобальные переменные?
- C#. Как сделать, чтобы программа проверяла тип введённой переменной?
- Помогите с программой по языку Pascal, задание на записи (комбинированный тип переменной).
- Почему в этой программе переменная объявлена дважды? (C++, WinAPI)