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); /* conversion warning */
for (i = 1; i <= len; i++) {
lua_rawgeti(L, 1, i);
lua_rawseti(L, -2, i);
}
return 1;
}
Но, бросок требуется, чтобы заставить замолчать предупреждение:
предупреждение: преобразование в 'int' из 'lua_Integer' может изменить его значение [-Wconversion]
Выполняя поиск по списку рассылки Lua, я обнаружил следующую ветку, посвященную Lua 5.2 (я полагаю, также относится и к более ранним версиям):
Цитата: Роберто Иерусалимский (7 августа 2012 г.)
Размер таблиц уже ограничен 2147483647 элементами. Lua внутренне использует int для индексирования всех своих массивов (кроме строк / байтовых массивов). Трудно везде работать со значениями без знака (например, size_t); У ptrdiff_t нет никаких гарантий вообще.
Это все еще относится к Lua 5.3, которая использует long long
за lua_Integer
? Является ли актерский состав int
от lua_Integer
как используется в приведенном выше примере безопасно в Lua 5.3?
1 ответ
Размер таблицы (количество элементов) по-прежнему ограничен "int". Это не мешает таблице иметь произвольные ключи lua_Integer (если таблица не является правильной последовательностью).