【面试】lua

本文深入探讨Lua编程语言的关键特性,包括热更新机制、与C++的交互方式、表的保护方法、全局变量管理技巧以及垃圾回收机制的详细解析。

面试题-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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值