Lua内存管理
Lua ?要求用户给出一个内存管理函数,在 Lua创建虚拟机的时候传入。。?
它利用 C?标准库中的函数实现了一个默认的内存管理器,这也可以帮助我们理解这个内存管理器的语义。?
1: ? ?Lua定义的内存管理器仅有一个函数,虽然接口上类似 realloc但是和 C 标准库中的realloc有所区别。它需要在 nsize = 0 时,提供释放内存的功能。?
2: ?和标准库中的内存管理接口不同,Lua?在调用它的时候会准确给出内存块的原始大小。? 3: ?对于需要为Lua定制一个高效的内存管理器来说,这个信息很重要。因为大多数内存管理的算法,都需要在释放内存的时候了解内存块的尺寸。? 6:?另外,这个内存管理接口接受一个额外的指针 ud??。这可以让内存管理模块工作在不同的堆上。恰当的定制内存管理器,就可以回避线程安全问题。不考虑线程安全的因素,我们可以让内存管理工作更为高效? 7:?另一个可以辅助我们做出更有效的内存管理模块的机制是在Lua5.2?时增加的。当Lua传入 ptr = NULL时,osize的含义变成了对象的类型。这样,分配器就可以得知我们是在分配一个什么类型的对象,可以针对它做一些统计或优化工作。? Lua使用了一组宏来管理不同类别的内存:单个对象、数组、可变长数组等。这组宏定义在 lmem.h中
这组宏的核心在一个内部API?:?luaM_realloc_,它不会被直接调用? 其实现在 lmem.c?中。它调用保存在 global_State?中的内存分配器管理内存。这些工作不仅仅是分配新的内存,释放不用的内存,扩展不够用的内存。Lua也会通过realloc试图释放掉预申请过大的内存的后半部分,当然,这取决于用户提供的内存管理器能不能缩小内存块了。?
从代码中可以看到,luaM_realloc_根据传入的osize和nsize调整内部感知的内存大小(设置GCdebt),在内存不够用的时候会主动尝试做GC?操作。?
lmem.c中还有另一个内部API?luaM_growaux_,它是用来管理可变长数组的。其主要策略是当数组空间不够时,扩大为原来的两倍。? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |