Lua学习笔记四之用C为Lua定义类型(UserData)
来源:互联网 发布:2017网络原创歌手 编辑:程序博客网 时间:2024/06/06 15:34
继续学习Lua与C交互,下面是在用C为Lua定义类型(UserData)的笔记以及自己的理解,其中学习过程中的写的测试代码都可以从我的github下载。
0、Lua中使用userdata类型来表示在C中定义的类型。userdata只是提供了一块原始的内存区域,可以用来存储任何东西,并且,在lua中userdata没有任何预定义的操作。在C中调用函数lua_newuserdata会根据指定的大小分配一块内存,并将相应的userdata压入栈中,最后返回这个内存块的地址:void *lua_newuserdata(lua_State *L,size_t size)。1、实质在C中定义lua的userdata,与定义C模块完全类似,只不过通常这时需要通过调用lua_newuserdata来告诉lua分配一块额外的内存,而在内存所有相关的操作都是在C中的定义的,实质就是C模块中的接口。注意这块分配的额外内存是由Lua垃圾收集器来管理的,无须关心起释放等情况。2、在实现一个Lua的程序库或userdate,必须保证该库或userdata的接口不应破坏C数据或在Lua中导致core dump。3、可以为每种userdata创建一个唯一的元表,来辨别不同类型的userdata,每当创建了一个userdata后,就用相应的元表来标记它,而每得到一个userdata后,就检查它是否拥有正确的元表,注意Lua代码中不能改变userdata的元表(当能增加已有元表的属性,比如对元表key为__index赋值)。通常是将这个元表存储在注册表中,也类型名作为key,元表为value。辅助库提供了一些函数来实现这些:int luaL_newmetatable(lua_State*L, const char *tname);void luaL_getmetatable(lua_State *L,const char *tnaem);void *luaL_checkudata(lua_State*L,int index,const char *tname);4、轻量级userdata是一种表示C指针的值(即void*),要将一个轻量级userdata放入栈中,只需要调用lua_pushlightuserdata即可。轻量级userdata只是一个指针而已。它没有元表,就像数字一样,轻量级userdata无须受垃圾收集器的管理。5、Lua在释放完全userdata所关联的内存时,若发现userdata对应的元表还有__gc元方法,则会调用这个方法,并以userdata自身作为参数传入。利用该特性,可以再回收userdata的同时,释放与此userdata相关联的资源。
1 0
- Lua学习笔记四之用C为Lua定义类型(UserData)
- Lua学习笔记四--返回值和UserData
- Lua-UserData(用户自定义类型)
- Lua学习笔记四
- Lua学习笔记(四)
- lua学习笔记之四(Lua中的基本函数库)
- lua userdata
- Lua Userdata
- Lua UserData
- lua学习笔记之类型和值
- Lua学习笔记二之C中调用Lua
- Lua学习笔记三之从Lua中调用C
- Lua中Userdata类型源码实现
- Lua中Userdata类型源码实现
- Lua学习笔记(四)
- lua 学习笔记 三 & 四
- Lua学习笔记(四)
- Lua学习笔记--C调用Lua
- 4.插入排序——表插入排序
- 2013年终总结
- 网页加载
- HDU 2151 Worm
- IOS开发创建开发证书及发布App应用指南
- Lua学习笔记四之用C为Lua定义类型(UserData)
- 雾里看JavaScript
- Tomcat 7的WebSocket实现(下)
- matlab中如何使用外部工具箱
- 让linux下无线网卡变身随身wifi----前言--iw移植
- .Net IE10 _doPostBack 未定义
- 通过偏移量来访问C++类数据成员实验
- ubuntu下lamp的搭建(绝对简单有效!)
- Java内存分配和String类型的深度解析