从类型上来看,lua一共有3种函数,分别是light c function、c closure和lua closure。关于第一种,light c function的概念,操作和调用流程,在第一章有着非常详细的阐述。至于第二种c closure,它有自己独立的数据结构,包含一个函数指针,以及一个upvalue列表,c closure实例受gc管控,c closure的创建流程,和运行流程,可...
typedef int (*lua_CFunction) (lua_State *L); lu_byte是个unsigned char类型,官方将其取名作lu_byte也许是表示lua unsigned byte的意思。 lua_CFunction表示Lua栈中能被调用的light c function的形式。 现在来看Lua的通用数据类型Value和TValue // lobject.h /* ** Tagged Values. This is the basic re...
typedef union Value{GCObject*gc;/* collectable objects */void*p;/* light userdata */int b;/* booleans */lua_CFunction f;/* light C functions */lua_Integer i;/* integer numbers */lua_Number n;/* float numbers */}Value;typedef struct lua_TValue{Value value_;//value具体的数值int ...
nil, boolean, number和lua_CFunction直接存储在TValue中,占用至少12个字节。 string, lua function, userdata, thread和table这些可以被垃圾回收管理的类型,TValue只是索引,具体数据存储在堆上,被gc指针索引。 下面重点介绍table的实现和性能。 Table的实现 Table对外的表现是一个Key-Value的Hash容器,除了nil以外的任...
其中boolean(布尔)、integer(整型)、double(浮点)、light userdata、light c function是直接存在栈上的 TString、Udata、Closure、Table、lua state在栈上只是一个指针,都为GC类型,当没有被引用时会被lua的GC系统自动回收,具体结构如下: 将不同类型的变量压栈 ...
intn;/* number of arguments (Lua) or returns (C) */ ptrdiff_t funcr = savestack(L, func); switch(ttype(func)) { caseLUA_TLCF:/* light C function */ f = fvalue(func); gotoCfunc; caseLUA_TCCL: {/* C closure */
因为你调用 Lua C API 的 C 代码块都是直接或间接被 Lua 调用的。但把 Lua C API 遍布在宿主程序中时却很容易忽视。完善的做法是,你应该把你的业务逻辑写到一个lua_CFunction中,然后用lua_pcall去调用它。而这个代码块的参数则应该用 void * 通过lua_pushlightuserdata来传递。
lua_CFunction f; /* light C functions */ lua_Integer i; /* integer numbers */ lua_Number n; /* float numbers */ } Value; #define TValuefields Value value_; int tt_ typedef struct lua_TValue { TValuefields; } TValue; #define LUA_TNIL 0 ...
其次,它们只能统计Lua函数(包括C编写的闭包和lightCFunction),无法统计C模块内部的C函数开销。而使用其他C性能分析工具时,也无法分析与Lua函数相关的耗时。这在进行性能分析时会导致非常不连贯的感觉。 此外,当使用C的性能分析器进行分析时,我们会失去上下文信息。由于Lua是用C语言编写的虚拟机,当我们发现某个C函数的...
lua_CFunction f; /* light C functions */ lua_Integer i; /* integer numbers */ lua_Number n; /* float numbers */ } Value; Lua内部用一个宏,表示哪些数据类型需要进行gc操作的: (lobject.h) #define iscollectable(o) (rttype(o) & BIT_ISCOLLECTABLE) ...