Где хранятся примитивные типы и как программа получает к ним доступ?

Пусть у нас есть переменная int a = 2;, глобальная. Где она хранится и как обрабатывается присваивание на низком уровне? Как приложение понимает где лежит переменная в оперативной памяти, если она не ссылочного типа? Или все же есть какая-то ссылка на этот примитив?
  • Вопрос задан
  • 3030 просмотров
Решения вопроса 1
@Oxoron
Шарпер
Базовый ответ: значение переменной хранится в стеке. Есть программа, ей при запуска ОС выдает кусок памяти. В этом куске есть стек переменных, там и хранится эта глобалка.

Любая переменная скрывает собой указатель. Грубо говоря, ты пишешь int a=2, что во время выполнения трансформируется в mov 00ff00aa, 2. Прога во время работы попросит у ОС кусок памяти, и в нем жестко выделит место под примитив. Везде, где в исходниках стоит переменная 'a', в бинарниках будет выделенный адрес (компилятор постарается).

Плюс, есть сильная зависимость от языка. Если используется Java, примитив может оказаться в куче (сам не джавист, но в .NET подобные ситуации возможны). Там, по идее, точное расположение в памяти зависит от реализации сборщика. Но тут нужен джавист-спец.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AxisPod
@AxisPod
Первая проблема, в C# не может быть глобальных переменных, так же как и в Java.

Если вы объявляете локальную переменную в методе, она попадёт на стек. Если же это поле класса или структуры, то переменная становится частью объекта и поведение зависит от родителя.

C Objective-C не подскажу.

В C иначе, глобальные переменные вкомпиливаются в бинарный файл. Выделяется сегмент данных, при загрузке для него будет выделена память и данные будут скопированы туда средствами ОС. Тут зависит от компилятора и квалификаторов, const скорее всего попадут в отдельный сегмент без привелегий на запись.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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