「function at line 1 has more than 65536 constants」
というエラーが返ってきた。
ネットでテーブルの上限を調べてみても、メモリ次第という答えしか見つからなかった。
テストプログラムで実験してみると、配列の要素数、キーの数には制限がなさそうだけど
テーブル要素が65536を超えると、前述のエラーが出る。
o = {
{a=1},
{a=1},
{a=1},
.
. 全部で65536個
.
{a=1},
}
エラー。{a=1},
{a=1},
{a=1},
.
. 全部で65536個
.
{a=1},
}
oと中身の65536個を足すと65537個になる。中身が65535個ならエラーにならない。
1変数内の最大数が65536までなのかと思い下記のコードを実行
o = {
{a=1},
.
. 全部で35535個
.
{a=1},
}
エラー。{a=1},
.
. 全部で35535個
.
{a=1},
}
o2 = {
{a=1},
.
. 全部で30000個
.
{a=1},
}
{a=1},
.
. 全部で30000個
.
{a=1},
}
oと中身の35535個、o2と中身の30000個で65537個。
oの中身を35534個にすればエラーにならない。
グローバルスコープで宣言できる数が、65536までらしい。
function x()
o = {
{a=1},
.
. 全部で65535個
.
{a=1},
}
end
OK。o = {
{a=1},
.
. 全部で65535個
.
{a=1},
}
end
g = {
{a=1},
.
. 全部で65533個
.
{a=1},
}
{a=1},
.
. 全部で65533個
.
{a=1},
}
x関数のスコープ内はoと中身で65536個、グローバルスコープはgと中身で65534個+関数で65536個と数えるらしい。関数は2個扱い?
gの要素数を65534個にするとエラーになる。
x関数内にo2を増やしても、g側の要素数には影響しなかった為、x関数内の変数の数は関係ないようだ。
関数を増やしてみる。
function x()
.
.
.
end
function y()
.
.
.
end
g = {
OK。.
.
.
end
.
.
.
end
{a=1},
.
. 全部で65531個
.
{a=1},
}
.
. 全部で65531個
.
{a=1},
}
x関数、y関数、gと中身の65531個で65536個。
gの中身を65532個にするとエラーになる。
関数を3個に増やした場合、gの要素を65529個にすればエラーにならない。
やはり関数は2個と数えるようだ。
関数を要素に入れてみる。
g = {
エラー。
{a=1},
.
. 全部で65533個
.
{a=1},
f = function() return {} end
}
.
. 全部で65533個
.
{a=1},
f = function() return {} end
}
なぜか、関数を要素に入れる場合は3個で数えるようだ。
gの要素を65532個にするとエラーでなくなる。
関数を2つ入れてみる。
g = {
なぜか、2つ目は2個でエラーにならない。
{a=1},
.
. 全部で65531個
.
{a=1},
f = function() return {} end,
f2 = function() return {} end
}
.
. 全部で65531個
.
{a=1},
f = function() return {} end,
f2 = function() return {} end
}
3つ目も同様で2個扱い。
最初の関数定義だけは、3つで数えるらしい。
最後定義されている関数を入れてみる。
function x() return {} end
g = {
定義されている関数を追加する場合は1つ目の関数だとしても2つ計算となった。g = {
{a=1},
.
. 全部で65531個
.
{a=1},
f = x
}
.
. 全部で65531個
.
{a=1},
f = x
}
0 件のコメント:
コメントを投稿