Как выделяется память для переменных в JavaScript?
Я хотел бы узнать, как происходит выделение памяти для локальных переменных в JavaScript. В C и C++ локальные переменные хранятся в стеке. То же самое происходит и в JavaScript, или всё хранится в куче?
1 ответ(ов)
К сожалению, ответ на ваш вопрос: «Это зависит».
В последнее время в движках JavaScript произошел существенный сдвиг в сторону более эффективной оптимизации, чем это было раньше. Ранее ответ был примерно таким: «Локальные переменные хранятся в фреймах стека, выделяемых в куче, для работы замыканий». Однако сейчас ситуация стала более сложной.
Существовали исследования, касающиеся реализации Scheme и оптимизации замыканий (JavaScript наследовал от Scheme практически все замыкания, за исключением продолжений, которые усложняют ситуацию). У меня нет под рукой ссылок на соответствующие материалы, но если у вас нет невероятно эффективного сборщика мусора, вам также нужно использовать стек. Сложность заключается в том, что при работе с замыканиями переменные должны быть выделены в куче. Для этого применяются различные стратегии. Результатом является гибридная модель, в которой:
- Внедрение (Inlining) функций может значительно сократить количество выделяемых и освобождаемых фреймов в куче.
- Некоторые переменные можно безопасно поместить в стек, так как их временной диапазон ограничен (это часто связано с внедрением вызовов функций).
- В некоторых случаях вы можете знать, что собираетесь создать замыкание, но можете подождать, пока это не произойдет, а затем выделить фрейм стека в куче и скопировать текущие значения из стека.
- Существуют оптимизации, связанные с хвостовыми вызовами, когда вы можете ранее выделить память в куче и повторно использовать фрейм стека для следующего вызова функции, но, насколько мне известно, в текущих JavaScript-движках это не применяется.
Эта область быстро меняется в нескольких конкурирующих движках, поэтому ответ, вероятно, останется таким же — «это зависит».
Кроме того, в новых версиях языка мы увидим такие возможности, как let
и const
, которые действительно упрощают двигателям оптимизацию решений по выделению памяти. Особенно неизменяемость значений помогает, так как вы можете свободно копировать значения из стека (и, например, делать их частью объекта замыкания) без разрешения конфликтов изменения переменных из разных замыканий.
Где найти документацию по форматированию даты в JavaScript?
Как явно освободить память в Python?
Как определить нажатие клавиши Esc?
Как проверить, содержит ли массив строку в TypeScript?
Как остановить Babel от трансформации 'this' в 'undefined' и добавления "use strict"