|
|
更多文章在http://user.qzone.qq.com/109339129/blog/1208322250
最近在研究lua脚本,一开始学的倒挺快,后来发现自己没有真的理解,于是看了一点点lua的源码,清晰多了,下面以例子来分析下,以下c程序执行后,lua的内存变化,以便能更深入的理解lua.
lua脚本
f("how", t.x, 14);
这里是 C 里的代码:
开始的内存布局
-1 |................| top
|............... |
|LUA_GLOBALSINDEX| -->此是个table 并保存有哈希表,哈希表中根据字符串来哈希此表的内容
lua_getfield(L, LUA_GLOBALSINDEX, "f"); /* 将调用的函数 */
从LUA_GLOBALSINDEX处的哈希表从查找,"f"所对应的object*结构,并把它置顶。
执行完后的内存布局
-1 |"f"的object*结构|
|............... |
|LUA_GLOBALSINDEX|--->哈希表()
lua_pushstring(L, "how"); /* 第一个参数 */
-1 | "how" | 创建一新的object,并存字符串进去。
-2 |"f"的object*结构|
|............... |
|LUA_GLOBALSINDEX|--->哈希表()
lua_getfield(L, LUA_GLOBALSINDEX, "t"); /* table 的索引 */
从LUA_GLOBALSINDEX处的哈希表从查找,"t"所对应的object*结构,并把它置顶。
-1 |"t"的object*结构| 因为"t"对应一张表,所以也有哈希表保存成员--->哈希表()
-2 | "how" | 创建一新的object,并存字符串进去。
-3 |"f"的object*结构|
|............... |
|LUA_GLOBALSINDEX|--->哈希表()
lua_getfield(L, -1, "x"); /* 压入 t.x 的值(第 2 个参数)*/
-1 |"x"的object*结构| 从位置为-1的表(表"t")的哈希表中寻找"x"对应的object*结构,并把它置顶。
-2 |"t"的object*结构| 因为"t"对应一张表,所以也有哈希表保存成员--->哈希表()
-3 | "how" | 创建一新的object,并存字符串进去。
-4 |"f"的object*结构|
|............... |
|LUA_GLOBALSINDEX|--->哈希表()
lua_remove(L, -2); /* 从堆栈中移去 't' ,也就是 -2的位置*/
-1 |"x"的object*结构|
-2 | "how" | 创建一新的object,并存字符串进去。
-3 |"f"的object*结构|
|............... |
|LUA_GLOBALSINDEX|--->哈希表()
lua_pushinteger(L, 14); /* 第 3 个参数 */
-1 |14的object*结构| 也就是创建新的obj,并 (obj)->value.n=14,然后置顶。
-2 |"x"的object*结构|
-3 | "how" | 创建一新的object,并存字符串进去。
-4 |"f"的object*结构|
|............... |
|LUA_GLOBALSINDEX|--->哈希表()
lua_call(L, 3, 1); /* 调用 'f',传入 3 个参数,并索取 1 个返回值 */
[em2] [em2] |
|