面试题-lua
1.lua热更
2.lua和C++交互
3.lua禁止修改表
4.lua禁止全局变量
5.lua原表
6.lua gc
要打破require缓存机制,我们必须删除缓存,package.loaded[module_name] = nil就可以做到。
https://blog.csdn.net/zxm342698145/article/details/80613429
lua和c++是通过一个虚拟栈来交互的。
c++调用lua实际上是:由c++先把数据放入栈中,由lua去栈中取数据,然后返回数据对应的值到栈顶,再由栈顶返回c++。
lua调c++也一样:先编写自己的c模块,然后注册函数到lua解释器中,然后由lua去调用这个模块的函数。
lua调用C++还可以用tolua++
https://blog.csdn.net/shun_fzll/article/details/39120965
1.设置元表__newindex后,默认的赋值操作由显式指明的元方法控制,但还是可以使用rawset函数直接往tab赋值,不经过__newindex元方法;
2.table.insert()接口也不会经过__newindex元方法;
3.更改表中现有而且是没设置元表的key-value,也不会经过__newindex元方法;
https://blog.csdn.net/inininin123/article/details/109823907
Lua中创建全局变量的小技巧(禁止未预期的全局变量)
local __g = _G
-- disable create unexpected global variable
setmetatable(__g, {
__newindex = function(_, name, value)
local msg = "USE 'cc.exports.%s = value' INSTEAD OF SET GLOBAL VARIABLE"
error(string.format(msg, name), 0)
end
})
-- export global variable
cc.exports = {}
setmetatable(cc.exports, {
__newindex = function(_, name, value)
rawset(__g, name, value)
end,
__index = function(_, name)
return rawget(__g, name)
end
})
https://blog.csdn.net/liu943367080/article/details/88887906
lua防止访问不存在的全局变量
local tbDefineValue = {}
setmetatable(_G, {
__newindex = function(tb, key, value)
tbDefineValue[key] = true
rawset(tb, key, value)
end,
__index = function(tb, key)
if not tbDefineValue[key] then
error(string.format("找不到全局变量:%s", key))
return nil
end
end
})
function getValue(key, default)
local flag, value = pcall(function() return _G[key] end)
if flag then
return value
else
return default
end
end
a = getValue('a', 111)
print(a)
https://blog.csdn.net/wxc237786026/article/details/51661393
Lua GC机制分析与理解
1.Lua垃圾回收算法原理简述
lua采用了标记清除式(Mark and Sweep)GC算法,算法简述: 标记:每次执行GC时,先以若干根节点开始,逐个把直接或间接和它们相关的节点都做上标记; 清除:当标记完成后,遍历整个对象链表,把被标记为需要删除的节点一一删除即可。
2.Lua垃圾回收中的三种颜色
所谓的颜色就是上文中“算法简述”提到过的标记,lua用白、灰、黑三色来标记一个对象的可回收状态。(白色又分为白1、白2)
白色:可回收状态。 详解:如果该对象未被GC标记过则此时白色代表当前对象为待访问状态。举例:新创建的对象的初始状态就应该被设定为白色,因为该对象还没有被GC标记到,所以保持初始状态颜色不变,仍然为白色。如果该对象在GC标记阶段结束后,仍然为白色则此时白色代表当前对象为可回收状态。但其实本质上白色的设定就是为了标识可回收。
灰色:中间状态。 详解:当前对象为待标记状态。举例:当前对象已经被GC访问过,但是该对象引用的其他对象还没有被标记。
黑色:不可回收状态。 详解:当前对象为已标记状态。举例:当前对象已经被GC访问过,并且对象引用的其他对象也被标记了。 备注:白色分为白1和白2。原因:在GC标记阶段结束而清除阶段尚未开始时,如果新建一个对象,由于其未被发现引用关系,原则上应该被标记为白色,于是之后的清除阶段就会按照白色被清除的规则将新建的对象清除。这是不合理的。于是lua用两种白色进行标识,如果发生上述情况,lua依然会将新建对象标识为白色,不过是“当前白”(比如白1)。而lua在清扫阶段只会清扫“旧白”(比如白2),在清扫结束之后,则会更新“当前白”,即将白2作为当前白。下一轮GC将会清扫作为“旧白”的白1标识对象。通过这样的一个技巧解决上述的问题。
https://zhuanlan.zhihu.com/p/133939450