Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51

Адресация переменных и всей структуры программы на реальной памяти в ОС

20.11.2017, 21:38. Показов 4513. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, Вопрос по памяти, не совсем понятно:
1. Я написал программу 1.cpp, выполняю ее компиляцию, если я не использую динамическое выделение памяти, то при ее компиляции, исходя из объявленных переменных и еще чего-то там(?????), вычисляется объем памяти, требуемый для выполнения программы, затем происходит линковка - компоновка написанной программы, адресация каждой инструкции и разрешение имен для ф-ций(их адресация) . Линкер делает адресацию относительно "нуля" всего блока инструкций. Таким образом получается исполняемый файл - блок инструкций с рассчитанным, для его выполнения, объемом данных, у которого каждая инструкция теперь имеет адрес и за именем ф-ции скрывается адрес.

2. При запуске такого файла, ОС выделяет память, рассчитанную при компиляции и загружает программу в какую-то область оперативки с адресом X, где X и является по-сути тем самым "нулем" программы. ОС настраивает процессор на выполнение 1-ой инструкции и начинается ее выполнение, как только он доходит до инстр. вызова ф-ции, он кладет в IP адрес след.инструкции (в стек?) и переходит по адресу, который был дан ф-ции при линковке, передавая пар-ры этой ф-ции в стек обл-ти памяти где лежит наша программа. (Как этот стек выделяется? Это часть памяти, рассчитанной при компиляции? ) , затем ф-ция выполняется, работая с лок. переменными, которые лежат в том же стеке, и дойдя до return из стека (IP???) выдергивается адрес возврата и "процессор возвращается с каким - то значением".

3. При использовании динамического выделения, у нас и статическая память будет иметь место, в которой будет храниться выполняемая программа? и в процессе выполнения программы, дойдя до инструкции malloc (new), происходит выделение дин.памяти "где-то" в опер. памяти.
Верно ли я понимаю, скорректируйте, пожалуйста))))

Хочу понять и иметь общее представление о данном процессе) Буду очень рад, если кто-нибудь возьмется написать поэтапно все это)))
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.11.2017, 21:38
Ответы с готовыми решениями:

GlobalAlloc и адресация структуры
Привет всем! У меня небольшой вопрос по-поводу программирования на TASM (думаю он также касатеся и других ассемблеров). Пишу на...

Адресация переменных по стандарту МЭК 61131-3
Добрый день. Столкнулся с проблемой. Есть среда AXEl Logiclab по стандарту (МЭК 61131-3), есть исходные коды программы управления...

Адресация памяти
Добрый день, друзья. Начав изучать такую замечательную вещь, как программирование, в частности язык C++, столкнулся с необходимостью...

42
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,088
03.12.2017, 03:24
Лучший ответ Сообщение было отмечено prado777 как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от prado777 Посмотреть сообщение
Регистры переменных, это регистры процессора?
Что вы понимаете под "регистрами переменных"? Мне этот термин не знаком.
Цитата Сообщение от prado777 Посмотреть сообщение
Получается при загрузке лок. переменных в память они по возможности загружаются именно в них, а вот если их не хватает - то в стек?
Пока забудьте про регистры: ими занимается компилятор. Если подробнее, то переменные постоянно копируются из ОЗУ в регистры для проведения операций, после чего сохраняются обратно. Вот что учесть стоит - компилятор может менять инструкции местами, сохранять переменные в других переменных, регистрах, кэше и астрале - где угодно, пока это не меняет поведение программы. Но это может помешать при доступе их других потоков или прерываний. Пока это надо просто запомнить, поскольку на практике встретите не скоро.
Цитата Сообщение от prado777 Посмотреть сообщение
4. В сегменте данных хранятся данные (переменные глобальные), но могут и локальные?
как сочтет нужным компилятор. Какие-то локальные переменные может и туда.
Цитата Сообщение от prado777 Посмотреть сообщение
5. В стеке хранятся лок. переменные, если при регистров не хватает, указатели на данные из сегмента данных.
Какой случай рассматриваем? С оптимизацией или без? Если с оптимизацией, то часть переменных компилятор может просто выкинуть. Если без то на стеке будут храниться все локальные переменные, а в регистры перемещаться только на время операций.
Цитата Сообщение от prado777 Посмотреть сообщение
6. При вызове ф-ции локальные переменные берутся из стека или из регистров (если их хватило)
При вызове функций локальные переменные не "берутся" в "создаются". Верхушка стека увеличивается чтобы вместить область локальных переменных. Сама область не очищается и не инициализируется, если в коде это не указано явно. После завершения функции верхушка стека возвращается на место.
Цитата Сообщение от prado777 Посмотреть сообщение
9. После закрытия exe, вся память, которая была выделена проге освобождается.
Не обязательно. От ОС зависит.
Цитата Сообщение от prado777 Посмотреть сообщение
10. malloc() realloc() calloc() работают неявно? То есть под объявлением переменной int x=10 скрывается malloc()?
Нет. Смещение локальных и глобальных переменных определено еще во время компиляции, место под них заранее зарезервировано.
Цитата Сообщение от prado777 Посмотреть сообщение
Значит куча - это сегмент данных
Куча это вся свободная память, доступная ОС. Именно поэтому у программы нет к ней прямого доступа - только через malloc. Учтите, что если в стеке занято, скажем, половина, оставшееся место не является кучей. Это все еще стек, он выделен для приложения.
1
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
03.12.2017, 12:39  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
При вызове функций локальные переменные не "берутся" в "создаются". Верхушка стека увеличивается чтобы вместить область локальных переменных. Сама область не очищается и не инициализируется, если в коде это не указано явно. После завершения функции верхушка стека возвращается на место.
Погодите, получается, если я не инициализирую переменную, то она может принять значение той, которая осталась в стеке? Это возможно?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.12.2017, 12:45
prado777, да. А ты не знал?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.12.2017, 12:45

Адресация переменных: найти и исправить ошибку в коде
Приветствую. Есть код: #include "stdafx.h" #include <iostream> using namespace std; int main() { int a; cin>>a; ...

Распределение и адресация памяти
Доброго времени суток. Уважаемые гуру и ассемблеристы , требуется подсказка начинающему программисту. Вопрос заключается в следующем: Есть...

Сегментная адресация памяти
Здравствуйте, читаю небольшой материал про процессор 8086 и появившийся в нем режим сегментации памяти. Хотел бы задать несколько...

Туториал по написанию реальной программы
Всем привет. Я изучаю язык программирования C# и понимаю, что чтобы научиться реально программировать, нужно написать настоящие программы...

Адресация памяти, помогите разобраться
Имеется контроллер STM32F100RB. Исходя из рисунка видно, что у нас имеется 4Гб, к которым мы можем обратиться. <Изображение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
43
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru