@beduin01

Как научиться понимать как работает память на низком уровне?

Столкнулся с тем, что теорию про кучу и стек знаю, но визуальная картинка у меня в голове упорно не формируется. Есть ли какой-то способ с этим разобраться так, чтобы в голову легло раз и навсегда. Или быть может есть какая-то наглядная штука которая позволяет это лучше понять?

Кучу статей с картинками я уже перечитал. Не помогло.

Интересует момент начиная от. Вот объявляем мы переменную и что происходит дальше и как дальше структуры и классы располагаются в памяти.
  • Вопрос задан
  • 1108 просмотров
Пригласить эксперта
Ответы на вопрос 6
Griboks
@Griboks
Прочитайте про процессоры, их архитектуры, доступ к памяти, почему возникли кэши вместо оперативки и т.д.
Стек и куча - это всего лишь абстракция.
Ответ написан
@kmg4e
Столкнулся с тем, что теорию про кучу и стек знаю, но визуальная картинка у меня в голове упорно не формируется. Есть ли какой-то способ с этим разобраться так, чтобы в голову легло раз и навсегда. Или быть может есть какая-то наглядная штука которая позволяет это лучше понять?


Самый лучший вариант - написать свою кучу.
Правда это и трудоемкий самый вариант для понимания.

Требуется язык без сборки мусора. С, Pascal и т.п.
Ответ написан
Therapyx
@Therapyx
Data Science
Я бы мог конечно опять написать 2 страницы со всякими иллюстрациями, но не вижу смысла. Вы где и что смотрели, что вот так уж осталось не понятным?
Вот допустим 3-ая картинка, что именно тут не понятно или не совсем ясно? androidexample.com/Use_of_Heap_and_Stack_memory_in...
"Интересует момент начиная от. Вот объявляем мы переменную и что происходит дальше и как дальше структуры и классы располагаются в памяти."

- Полностью описывает этот критерий.

Чтобы знать больше, надо заняться уже операционными системами -> процессы -> нити -> ахитектура ЭВМ.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Главное нужно помнить, что память - она плоская, т.е. представляйте ее просто набором байт следующих друг за другом. И не важно, какие структуры вы в плоской памяти городите, трехмерные или пяти - они все должны отображаться на плоскую память.
Когда ОС загружает программу на выполнение она разделяет всю память, доступную процессу на 3 группы:
1. область куда загружается код программы. Обычно эта память помечается ОС только для чтения. И если туда будет попытка записи, то это вызовет исключение в процессоре.
2. Область стека. Адрес вершины стека записывается в регистр процессора. Когда в программе выделяются локальные переменные они помещаются именно в стек.
Фактически для помещения переменной в стек не надо выделять память. Компилятор при сборке программы считает смещения относительно начала стека и обращение к локальным переменным происходит по указателю на начало стека + смещение.
Со стеком интересная история: ОС выделяет под стек фиксированный размер памяти, но сам размер стека нигде не хранится (в явном виде не хранится, но его в можно узнать), хранится только указатель на начало. Поэтому всегда есть шанс переполнения стека. Например если сделать достаточно глубокую рекурсию.
В современных ОС под стек выделяется достаточно большой объем памяти, поэтому переполнений как правило не происходит. Но иногда для программы требуется больший объем стека, тогда нужный размер указывается с помощью опций компилятора, этот размер зашивается в исполняемый файл и когда загрузчик ОС грузит программу он считывает размер стека и выделяет нужную область памяти.
Если вы в своей программе столкнулись с переполнением стека, то не спешите выделять больший объем памяти для стека, возможно у вас программная ошибка из-за которой происходит переполнение.
3. Куча. Там выделяется память для динамических переменных. Память выделяется ОС по запросу. Обычно в своей программе вы используете менеджер кучи стандартной библиотеки, который в свою очередь обращается за выделением памяти к ОС. Менеджер кучи из стандартной библиотеки можно поменять, есть бесплатные свободно распространяемые реализации. Или сделать свой или пользоваться вызовами ОС для выделения памяти.

Как-то так.
Ответ написан
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.

Интересует момент начиная от. Вот объявляем мы переменную и что происходит дальше и как дальше структуры и классы располагаются в памяти.

Все сильно зависит от используемого языка программирования, типа архитектуры, и извратов программистов, исследователей и математиков.
Рекомендую прочитать вот это, все очень понятно и в картинках - www.cs.virginia.edu/~evans/cs216/guides/x86.html
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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