Lua 中值的最小大小是多少

Lua 中的值可以有多小?例如,一个数字。

当计算值数组大小时,这种知识特别有用。

点赞
用户1717115
用户1717115

以下是Lua 5.3中 Value 的定义方式:

#define TValuefields    Value value_; int tt_

/*
** 标记为“标记值”。
** 这是Lua值的基本表示形式,
** 包括实际值和带有类型的标记。
*/

/*
** 所有Lua值的联合体
*/
typedef union Value {
  GCObject *gc;    /* 可收集的对象 */
  void *p;         /* 轻量级用户数据 */
  int b;           /* 布尔值 */
  lua_CFunction f; /* 轻量级C函数 */
  lua_Integer i;   /* 整数值 */
  lua_Number n;    /* 浮点数值 */
} Value;

#define TValuefields    Value value_; int tt_

typedef struct lua_TValue {
  TValuefields;
} TValue;

GCObject 的定义方式如下:

/*
** 所有可收集对象的通用类型
*/
typedef struct GCObject GCObject;

/*
** 所有可收集对象的通用头(以宏的形式呈现,以包含在其他对象中)
*/
#define CommonHeader    GCObject *next; lu_byte tt; lu_byte marked

/*
** 通用类型仅具有通用头
*/
struct GCObject {
  CommonHeader;
};

lu_byte 的定义方式如下:

/* 用作小自然数的字符(为了'char'保留给字符)*/
typedef unsigned char lu_byte;

lua_CFunction 的定义方式如下:

/*
** 注册给Lua的C函数的类型
*/
typedef int (*lua_CFunction) (lua_State *L);

lua_Integer 的定义方式如下:

/* 用作整数函数的类型 */
typedef LUA_INTEGER lua_Integer;

LUA_INTEGER 的定义取决于平台和构建设置,但通常为64位有符号整数。

lua_Number 的定义方式如下:

/* Lua中数字的类型 */
typedef LUA_NUMBER lua_Number;

LUA_NUMBER 也取决于配置和平台,但通常为double

因此,要获得最小尺寸,您必须计算以下内容(在假设所有指针类型具有相同长度的情况下):

max(sizeof(pointer), sizeof(int), sizeof(LUA_INTEGER), sizeof(LUA_NUMBER)) + sizeof(int) + padding

在x86_64上,这通常是:

sizeof(pointer) + sizeof(int) + padding  = 8 + 4 + 4 = 16

在32位x86上:

sizeof(double) + sizeof(int) + padding = 8 + 4 + 4 = 16
2017-10-24 19:32:20