Как двумерный массив хранится в памяти?
Я подумал о следующем подходе, при котором строки хранятся как непрерывные блоки памяти.
| _ __ _ __ _ __ || _ __ _ __ _ __ | __ _ __ _ __ | _ __ _ __ _ _ | ... | _ __ _ __ _ __ |
Элементы принимаются как (i, j) -> n * i + j, где n - размерность матрицы (предположим, что это nxn).
Но что, если я хочу добавить к нему новый столбец? Мне пришлось бы обновить каждый (n + 1) -й элемент в каждой строке, а также сдвинуть их вправо, но это слишком затратно с точки зрения вычислений.
Другой вариант - скопировать матрицу в новое место и «на лету» обновить строки элементами нового столбца. Но это тоже не слишком эффективно, если массив большой.
И, наконец, третий вариант, о котором я подумал, - выделить фиксированный объем памяти для каждой строки, и когда я добавляю новый столбец, мне не нужно сдвигать строки вправо.
У меня не может быть пропусков в памяти, поэтому все блоки должны быть смежными.
Я не прошу реализовать C с использованием указателей и фактической оперативной памяти, мне просто любопытен теоретический подход к хранению динамического 2-мерного массива в памяти, чтобы можно было легко добавлять в него новые строки или столбцы. .
Есть ли другие более эффективные подходы?