16

我正在开发一个用 C 编写的简单堆栈机器,主要用于学习目的。在malloc/free用于我的内存操作之后,我认为从现代虚拟机中读取一些特定于内存分配的代码是一个好主意。

我下载了 Lua 源代码并开始阅读。过了一会儿,我意识到涉及到很多宏的东西,而且我找不到完成实际内存分配的代码(即malloc调用)。

find . -exec grep -i "malloc" '{}' \; -print

它只打印了一些malloc名称中包含单词的 Lua 宏。Lua VM(和编程语言)根本不使用malloc

所以这引出了一个问题:现代虚拟机如何处理内存分配?Lua 如何从堆中分配内存?除此以外还有其他分配方式malloc吗?其他方法的优缺点是什么?

我还想知道安全处理分配的内存的最佳实践、设计模式等。我在 Lua 的源代码中看到在分配内存之前有很多间接性。我在哪里可以了解这些东西?

4

2 回答 2

15

Lua 最肯定使用malloc, 形式realloc(也可以传递自定义分配器),但是,因为 Lua 使用 GC 就像 99% 基于 VM 的语言一样,它使用宏自动将 GC 头块添加到分配中。

您会发现 Lua 的内存全部由 和 中的例程处理,LuaM_这些都使用 VM 的全局状态来存储分配器,该分配器最初设置为(from ),但可以通过 来更改。lmem.clmem.hl_alloclauxlib.clua_setallocf

最近,LuaJIT 添加了分配下沉和一些非常酷的内存功能的计划,你可以阅读这篇关于LuaJIT 垃圾收集的文章。这篇文章涵盖了许多围绕 VM/JIT 内存分配、下沉、聚合和垃圾收集的策略和设计。

如您所见,内存分配和下沉策略与使用的 GC(如果有的话)密切相关。

就各种内存分配器的优缺点而言,使用标准malloc很容易使用,但代价是速度和浪费对齐以及每个分配上标记的各种额外块。

转向更高级的 arena、pool、slab 和 block 分配器,我们可以显着加快速度(尤其是对于固定大小的内部 VM 分配)并避免使用更通用的分配器(malloc例如这些分配器更复杂,如果您从头开始(在像 VM 这样的更大系统中只是提出问题),则必须调试它们,这与久经考验的 CRTmalloc实现相反。

于 2012-07-04T07:23:00.353 回答
5

Lua核心不使用malloc和朋友。realloc它依赖于用户提供的具有类似语义的内存分配函数(但在处理NULL指针和大小为 0 时更精确)。见lua_Alloc

辅助 Lua 库提供了一个便利函数,该函数通过核心函数使用基于标准的内存分配函数 luaL_newstate创建 Lua 状态lua_newstaterealloc创建free。其他客户端可以使用适合其应用程序的任何内存分配。

于 2012-07-04T10:42:14.977 回答