Как динамический 2D-массив сохраняется в памяти?

Как двумерный массив хранится в памяти?

Я подумал о следующем подходе, при котором строки хранятся как непрерывные блоки памяти.

| _ __ _ __ _ __ || _ __ _ __ _ __ | __ _ __ _ __ | _ __ _ __ _ _ | ... | _ __ _ __ _ __ |

Элементы принимаются как (i, j) -> n * i + j, где n - размерность матрицы (предположим, что это nxn).

Но что, если я хочу добавить к нему новый столбец? Мне пришлось бы обновить каждый (n + 1) -й элемент в каждой строке, а также сдвинуть их вправо, но это слишком затратно с точки зрения вычислений.

Другой вариант - скопировать матрицу в новое место и «на лету» обновить строки элементами нового столбца. Но это тоже не слишком эффективно, если массив большой.

И, наконец, третий вариант, о котором я подумал, - выделить фиксированный объем памяти для каждой строки, и когда я добавляю новый столбец, мне не нужно сдвигать строки вправо.

У меня не может быть пропусков в памяти, поэтому все блоки должны быть смежными.

Я не прошу реализовать C с использованием указателей и фактической оперативной памяти, мне просто любопытен теоретический подход к хранению динамического 2-мерного массива в памяти, чтобы можно было легко добавлять в него новые строки или столбцы. .

Есть ли другие более эффективные подходы?

6
задан flowerpower 4 January 2012 в 21:24
поделиться