lua_Integer和lua_createtable(表大小限制)

在 Lua 5.3 中,C API 中与表相关的函数接收和返回 lua_Integer

void lua_rawgeti (lua_State *L, int idx, lua_Integer n);
void lua_rawseti (lua_State *L, int idx, lua_Integer n);
lua_Integer luaL_len (lua_State *L, int index);

但是,lua_createtable 仍然接收 int

void lua_createtable (lua_State *L, int narr, int nrec);

在下面的示例函数中,源表的长度用于创建一个相同大小的副本。

static int copy_sequence(lua_State *L) {
   lua_Integer len, i;
   luaL_checktype(L, 1, LUA_TTABLE);
   len = luaL_len(L, 1);
   lua_createtable(L, (int)len, 0); /* 转换警告 */
   for (i = 1; i <= len; i++) {
      lua_rawgeti(L, 1, i);
      lua_rawseti(L, -2, i);
   }
   return 1;
}

但是,需要进行强制转换才能消除警告:

警告:将“lua_Integer”转换为“int”可能会改变其值[-Wconversion]

在 Lua 邮件列表中搜索,我发现以下线程,它是关于 Lua 5.2 的(我假设也适用于早期版本):

引用:Roberto Ierusalimschy(2012年8月7日)

表的大小已经限制为2147483647个元素。Lua内部使用'int'索引所有数组(字符串/字节数组除外)。在所有地方使用无符号值(如 size_t)是一种痛苦;ptrdiff_t没有任何保证。

Lua 5.3 是否仍然是这种情况,其使用 long long 作为 lua_Integer?在 Lua 5.3 中从 lua_Integer 转换为 int,如上面的示例中使用的是否安全?

点赞
用户343123
用户343123

表的大小(元素数量)仍然受限于“int”。这并不会防止表具有任意的lua_Integer键(只要表不是一个适当的序列)。

2015-01-12 15:23:49