🍿 Почему локальные переменные «бесплатны» — и что на самом деле происходит при их создании?



Большинство разработчиков знают, что локальные переменные живут на стеке. Но мало кто задумывается: что значит «выделить память на стеке»? Спойлер — никакого malloc там нет.

🔍 Механизм

Стек — это непрерывный блок памяти, закреплённый за потоком при его запуске (обычно 1–8 МБ). Управление им сводится к одному регистру — rsp (stack pointer). При входе в функцию компилятор заранее вычисляет суммарный размер всех локальных переменных и генерирует одну инструкцию:

sub rsp, 48 ; "выделить" место под все локалы сразу
; 48 - смещение в байтах, на которое
; нужно сдвинуть указатель, чтобы
; выделить память под переменные

Никакого поиска свободного блока. Никакого обращения к ОС. Одна арифметическая операция над регистром.


⚡️ При выходе из функции

add rsp, 48 ; "освободить" — снова одна инструкция

Данные никуда не деваются физически — они просто становятся «за пределами» стека. Следующий вызов функции затрёт их своими данными.


❗️ Почему это важно


Аллокация на стеке — это O(1) по времени и нулевые накладные расходы на освобождение. Именно поэтому int x = 5; внутри функции принципиально дешевле new int(5) — разница не в синтаксисе, а в том, какой механизм памяти задействован.

✏️ Если видишь узкое место с частыми мелкими аллокациями — сначала спроси: можно ли это положить на стек?
Просмотры: 290
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти