« 贴两张前段去度假时拍的照片 | 返回首页 | 最近有点忙 »

如何在 Lua 注册表中选择一个合适的 Key

Lua 提供了一个注册表(REGISTRY)让我们的 C 扩展可以安全的把一些运行时数据放进去,而不被 lua 代码碰到。为了让各个 C 扩展库之间可以相安无事的工作,并且对注册表的操作又有较高效率。Lua 大神 Roberto 在神作 Pil 里给出了一个简洁的方案:用 static 变量的地址作为 key

静态变量在当前进程中一定拥有惟一的地址,且 lightuserdata 作 key 非常高效。这无疑是一个好方法。

但是,当模块的源码规模变大了以后,我们将代码分散到不同的源文件中。或者几个子模块需要相互协作时。这个方法就有了一定的缺陷。那就是,必须将这个静态变量暴露出来供大家蹂躏;或是写一个内部函数来取得它(其实没有本质区别)。

如果你也碰到这类问题,不妨看看下面的解决方案。

我们可以在子模块间约定一个字符串,比如 "foobar" 。如果能保证字符串惟一,直接用这个字符串做 key 当然也可以。不过效率稍微低了一点。(字符串压栈要多做一次 hash)。但是 lua 的虚拟机可以保证,只要字符串还有人引用,那么字符串对象就永远只有一份放在内存中,且不会被移动。

所以,只要保证这个字符串从未被回收,lua_tostring 的结果就永远是一致的。

明白了吗?每个子模块只要在初始化的时候,顺着调用:

lua_pushstring(L,"foobar");

key=lua_tostring(L,-1);

就可以保证得到的 key 是惟一地址了。

当然,你依然得谨慎选择字符串防止冲突。并且要自己在一个绝对安全的地方对这个字符串做至少一次引用。

Comments

我发现我无法在fedora 4下用C语言使用lua,应为GCC在连接的时候总是报告找不到lua的函数
正确答案是修改HWND的WS_XXXX的属性。
替换成一个透明图标,:)
这里有懂VC朋友的帮忙解决一个问题,请问MDI多文档子窗体左上角的图标怎么删除(是删除,不是替换),谢谢!
uuid

Post a comment

非这个主题相关的留言请到:留言本