• Lua是动态类型脚本语言,
    • 同一个变量可以在不同时刻指向不同类型的数据。

  • 用一个通用的数据结构lua_Tvalue
    • 统一表示所有在Lua虚拟机中需要保存的数据类型,
    • 这里将这个通用数据结构一层一层地拆解开来介绍。
    • C中实现相似的功能,一般做法是怎样

2.1 C中实现通用数据结构一般做法

  • 如果要用一个通用的数据结构来表示不同数据类型,
  • 一般的做法应该是这样的。

  • 一个字段来存储数据类型
  • 需存储不同的数据类型的数据。

  • 两种比较常见的做法

  • 定义一个公共的数据结构作为基础类型,

    • 里面存储的都是表达这个数据的基础信息,
    • 其他具体的类型是从这里派生出来。
  • 用类似下面的代码来模拟实现面向对象

char *data[0]我看好像不可以这样呢

  • 用union将所有数据包进来
  • 各有利弊。Lua代码中,一般两种相结合

2.2 Lua通用数据结构的实现

  • Lua开始设计中,
    • 主要类型:
    • 数字(用double表示)、
    • 字符串、
    • 关联表、nil、
    • userdata、
    • Lua函数以及C函数。
  • 一开始,并没有加入布尔类型,Lua函数和C函数是分开表示

  • 5.1.4版本时,
  • 加入THREAD类型
  • 及布尔类型(见表2-1),同时也将两种函数合并在一起
  • LIGHTUSERDATA
  • TUSERDATA
  • 对应都是void*指针,
  • 前者的分配释放由Lua外部使用者完成,
    • 后者通过Lua内部来完成的。
  • 前者不需要Lua关心它的生存期,由使用者自己去关注

  • Lua内部用一个宏
  • 表示哪些数据类型需要进行GC
  • LUA_TSTRING(包括它)之后的数据类型都要GC

  • 这些要GC的数据类型,在Lua中是如何表示?

  • 这些需要进行GC的数据类型都会有一个( ommonheader宏定义的成员,并且这个成员在结构体定义的最开始。
  • 用于表示表的数据类型 Table

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐