Глобальные переменные и переменные со статическим временем жизни обычно хранятся в сегменте данных, который настраивается загрузчиком исполняемых файлов операционной системы.
Этот загрузчик, вероятно, делает то, что сказал @John Zwinck о Unix. Например, в Windows есть VirtualAlloc, который также можно использовать для выделения памяти в адресном пространстве другой программы.
Локальные переменные обычно хранятся в так называемом стеке. Выделения в стеке выполняются довольно быстро, поскольку обычно они состоят только из модификации регистра указателя стека (sp, esp, rsp в семействе процессоров x86). Поэтому, когда у вас есть int (размер: 4 байта), этот регистр будет просто уменьшаться на 4 по мере роста стека вниз. В конце области видимости восстанавливается старое состояние регистра стека.
Также это делает опасным переполнение стека, когда вы можете перезаписать другие переменные в стеке, которые не должны быть изменены, например, адреса возврата вызовов функций.
Динамические переменные - это переменные, выделяемые с помощью malloc (C) или new (C ++), или любой из функций выделения, специфичных для операционной системы. Они помещаются в так называемую кучу. Они живут до тех пор, пока не будут очищены с помощью free / delete / os-specific-deallocator или пока программа не завершится (в этом случае разумная операционная система позаботится об очистке).
Кроме того, динамическое размещение является самым медленным из трех, поскольку требует обращения к операционной системе.
person
Felix Bytow
schedule
02.03.2015