Цитата
Так должно быть?
Да.
Цитата
Вариант 1 предпочтительнее в плане производительности?
Да, но нужно понимать насколько это критично для конкретного случая.
Первый вариант гарантирует, что данные будут расположены в памяти единым блоком (формально вроде бы не оговорено, но по факту луа старается делать именно так). Т.е. это массив в чистом виде.
Второй вариант будет содержать указатель на данные хранящиеся отдельно от непосредственно массива. Второй вариант может быть более производителен при присвоении строк, т.к. не будет требовать перестроения всего массива в момент присвоения, если строка не влазит. В этом варианте полная свобода по размеру данных в ячейке. Если мы пытаемся вставить элемент в середину массива, то это приводит к полному копированию "хвоста" массива, чтобы в середине образовалась дырка для наших данных. Указатели и хэш таблицы позволяют этого избежать, однако при переборе с большим количеством операций мы будем неизбежно проигрывать в производительности. Тут все достаточно очевидно на самом деле. Если у нас фиксированный массив, то интерпретатор вычисляет смещение от начала массива до нашей ячейки и получает данные, если хеш таблица, то интерпретатор вычисляет смещение от начала массива до нашей ячейки, считывает из нее указатель, получает данные по указателю. На один этап больше, дополнительное обращение к случайному участку памяти, как следствие снижение производительности.
// Кстати ты обратил внимание на то, что ты создаешь 2 мерный массив и присваиваешь ячейкам int значения, а потом вместа int присваиваешь массив? Вообще формально это допустимо, но выглядит дико.