Какова цель многомерных массивов?

У меня есть несколько вопросов о многомерных массивах. Я понимаю, как выделить память для них, но не понимаю, зачем это нужно (кроме как сделать вещи более читабельными).

[] оператор для массива перегружен, верно? Итак, почему нельзя выделить один блок памяти и предоставить доступ, 1dArray[i*nInRow][offset]?

Есть ли дальнейшее повышение производительности при использовании массива в нескольких измерениях? Кроме того, когда память динамически выделяется для двумерного массива, они хранятся в смежных местах или они разбросаны по куче? Когда данные запрашиваются, могу ли я предположить, что все извлекается из памяти как блок?

Большая часть информации, которую я видел, только что объяснила синтаксис. Любые ответы или предложенное чтение было бы здорово.

2

Решение

Оператор [] для массива перегружен, верно? Итак, почему нельзя выделить один блок памяти и предоставить доступ с помощью 1dArray [i * nInRow] [offset]?

Может, и на самом деле я бы рекомендовал это в общем случае.

Есть ли дальнейшее повышение производительности при использовании массива в нескольких измерениях?

На самом деле, нет. В зависимости от вашей компоновки вы можете оптимизировать попадания в кеш, но в точности то же самое можно сказать и о сглаженном одномерном массиве. Расположение памяти между ними (как правило) точно то же самое. Единственная разница заключается в семантическом тип массива и тот факт, что теперь вы должны реализовать поиск 2D-элементов самостоятельно.

Кроме того, когда память динамически выделяется для двумерного массива, они хранятся в смежных местах или они разбросаны по куче? Когда данные запрашиваются, могу ли я предположить, что все извлекается из памяти как блок?

Массивы всегда смежные.

Вы должны быть осторожны, хотя, что вы на самом деле выделение 2D-массива. Некоторые люди пишут int** ptr = new int*[2] затем выделите каждый «под-массив» вручную и подумайте, что у них есть 2D-массив. Они не. У них есть множество указателей, и это когда вы получите свой «рассеянный» макет. Ваш 2D массив int (*ptr)[3] = new int[2][3];,

2

Другие решения

Во-первых, есть многомерные проблемы.
Во-вторых, если многомерная проблема «разреженная», не имеет смысла выделять 99 * 99 * 99 * 99 * … * 99 элементов, а только указатели на структуры следующего уровня, которые скрыты умным синтаксическим массивом [ п] [я] [J] [к] …

Например, виртуальная память и таблицы страниц работают в современных ОС и ЦП.

0

Существует два типа двумерных массивов:

1) вид, где вся память находится в одном большом блоке, и

2) вид, где каждая строка (или каждый столбец) является смежной, но отдельные строки разбросаны вокруг, и у вас есть массив указателей для указания на каждую строку.

Тип # 2 имеет лучшую производительность в случае, если вы хотите сделать определенные вещи, такие как обмен строк, потому что все, что вам нужно сделать, это поменять местами два указателя.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector