Ответ 1
Lua наиболее определенно использует malloc
в форме realloc
(также можно также передать настраиваемый распределитель), поскольку Lua использует GC как 99% языков на основе VM, он автоматически использует макросы добавьте блок заголовка GC в выделение.
Вы найдете всю память Lua, обрабатываемую подпрограммами LuaM_
в lmem.c
и lmem.h
, все они используют глобальное состояние виртуальной машины для хранения распределителя, изначально установленного на l_alloc
(from lauxlib.c
), но его можно изменить на lua_setallocf
.
Недавно LuaJIT добавила потоки выделения и планирует некоторые действительно интересные функции памяти, которые вы можете прочитать в этой статье на LuaJIT Garbage Collection, В статье рассмотрены многие стратегии и разработки, связанные с распределением памяти VM/JIT, потоками, агрегацией и сбором мусора.
Как вы можете видеть, стратегии распределения памяти и снижения уровня очень тесно связаны с используемым GC (если есть).
В терминах pro и con различных распределителей памяти использование стандартного malloc
прост в использовании, но за счет скорости и потерь для выравнивания и различных дополнительных блоков, помеченных для каждого распределения.
Переходя к более продвинутым платформам арены, пула, сляба и блоков, мы можем резко ускорить работу (особенно для внутренних распределений VM с фиксированным размером) и избежать много фрагментации и накладных расходов, которые могут возникнуть с более распространенными распределителями, такими как malloc
, но, конечно, эти распределители более сложны, и вы должны их отлаживать, если вы начинаете с нуля (что в более крупной системе, такой как виртуальная машина, просто задает проблемы), как это было сделано с проверенным и проверенным CRT malloc
.