В предыдущей главе я упомянул, что размер стека обычно укладывается в несколько мегабайт. Как же тогда написать 3D игру, размер потребляемой ОЗУ которой достигает десятков гигабайт? Ответ очевиден из названия главы: использовать динамическую память. Ее у Вас столько, сколько разрешит операционная система. То есть, почти вся физически доступная.
С динамической памятью, также называемой кучей(от английского "heap"), программисты работают по-особому, а именно: сами определяют время жизни объектов, находящихся в ней. С++ предоставляет возможность выделять и удалять память в куче собственноручно, чего нельзя было делать со стеком. Это влечет за собой определенные последствия.
Как Вы уже знаете, для работы со стеком, исполняемой среде достаточно знать лишь адрес его верхушки, поэтому операции добавления/удаления производятся очень быстро. Что касается динамической памяти - все куда сложнее. Представьте, что сначала Вам понадобилось 4 байта под переменную "a" типа int32_t.
heap
[...]
[ ] 103
[ ] 102
[ ] 101
[ ] 100 = a
[...]
А затем еще два байта под переменную "b" типа int16_t.
heap
[...]
[ ] 105
[ ] 104 = b
[ ] 103
[ ] 102
[ ] 101
[ ] 100 = a
[...]
Но потом Вы решили испытать все прелести динамической памяти и освободили память, занимаемую переменной "a":
heap
[...]
[ ] 105
[ ] 104 = b
[ ] 103
[ ] 102
[ ] 101
[ ] 100
[...]
С этого момента, механизм распределения памяти должен решить задачку: если я вновь захочу выделить память под переменную, размером до 4 байт включительно, ее можно будет разместить на том же месте, где была переменная "a". В противном случае, переменную придется разместить за переменной "b". Поиск места для выделения памяти замедляет процесс выполнения программы. Как быть?
Правильно использовать и стек и динамическую память по их назначению. Стек - место для временных переменных, что участвуют в быстрых, мимолетных вычислениях. Куча - место для долгосрочных данных, которыми оперирует Ваша программа.
И напоследок: не стоит забывать, что память - лишь набор пронумерованных ячеек. Стек или куча - только вид работы с ней.
heap
[...]
[ ] 106
[ ] 105
[ ] 105
[ ] 104
stack
[ ] 103
[ ] 102
[ ] 101
[ ] 100
[...] 99
Комментариев нет:
Отправить комментарий