Lua 与C/C++ 交互系列: Lua调用C/C++函数(4-2)


1、本文继续讲解Lua调用C/C++函数,本文的重点是通过metatable来实现Lua Code面向对象调用注册的C函数。本文中涉及的Environment 伪索引,userdata 以及GC 垃圾回收器的内容,都是简单的讲解。不作为本文的重点,这些内容都将在以后的章节中继续讲解。

2、本文涉及的到主要知识点补充说明。

2.1 void *lua_newuserdata (lua_State *L, size_t size); 函数说明


This function allocates a new block of memory with the given size, pushes onto the stack a new full userdata with the block address, and returns this address. 
Userdata represent C values in Lua.
A full userdata represents a block of memory.
It is an object (like a table): you must create it, it can have its own metatable, and you can detect when it is being collected. 
A full userdata is only equal to itself (under raw equality). 
When Lua collects a full userdata with a gc metamethod, Lua calls the metamethod and marks the userdata as finalized. When this userdata is collected again then Lua frees its corresponding memory. 


lua_newuserdata()函数分配指定大小的新内存,然后把full userdata的内存地址压入虚拟栈,同时,lua_newuserdata()函数返回内存的地址。
在Lua C API中userdata用于拓展Lua的数据结构,可以在Lua中表示的自定义数据。
full userdata表示一块内存。userdata是一个对象(类型于Table):当刚创建userdata时,userdata可以拥有自己的metatable,还可以确定userdata何时被GC垃圾收集器当做垃圾收集。
full userdata仅仅和自己相等。
当GC垃圾收集器通过__gc元方法回收userdata内存时,Lua 调用__gc元方法并且标记userdata被终止。当GC再一次收集userdata时,Lua将释放userdata.

2.2  LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) 源代码分析

LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) 
{ //在LUA_REGISTRYINDEX伪索引上面获取tname的Table数据类型
  lua_getfield(L, LUA_REGISTRYINDEX, tname);  /* get registry.name */
  //如果LUA_REGISTRYINDEX伪索引上面已经存在值,则返回0
  if (!lua_isnil(L, -1))  /* name already in use? */
    return 0;  /* leave previous value on top, but return 0 */
  lua_pop(L, 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值