У меня есть несколько вопросов о многомерных массивах. Я понимаю, как выделить память для них, но не понимаю, зачем это нужно (кроме как сделать вещи более читабельными).
[]
оператор для массива перегружен, верно? Итак, почему нельзя выделить один блок памяти и предоставить доступ, 1dArray[i*nInRow][offset]
?
Есть ли дальнейшее повышение производительности при использовании массива в нескольких измерениях? Кроме того, когда память динамически выделяется для двумерного массива, они хранятся в смежных местах или они разбросаны по куче? Когда данные запрашиваются, могу ли я предположить, что все извлекается из памяти как блок?
Большая часть информации, которую я видел, только что объяснила синтаксис. Любые ответы или предложенное чтение было бы здорово.
Оператор [] для массива перегружен, верно? Итак, почему нельзя выделить один блок памяти и предоставить доступ с помощью 1dArray [i * nInRow] [offset]?
Может, и на самом деле я бы рекомендовал это в общем случае.
Есть ли дальнейшее повышение производительности при использовании массива в нескольких измерениях?
На самом деле, нет. В зависимости от вашей компоновки вы можете оптимизировать попадания в кеш, но в точности то же самое можно сказать и о сглаженном одномерном массиве. Расположение памяти между ними (как правило) точно то же самое. Единственная разница заключается в семантическом тип массива и тот факт, что теперь вы должны реализовать поиск 2D-элементов самостоятельно.
Кроме того, когда память динамически выделяется для двумерного массива, они хранятся в смежных местах или они разбросаны по куче? Когда данные запрашиваются, могу ли я предположить, что все извлекается из памяти как блок?
Массивы всегда смежные.
Вы должны быть осторожны, хотя, что вы на самом деле выделение 2D-массива. Некоторые люди пишут int** ptr = new int*[2]
затем выделите каждый «под-массив» вручную и подумайте, что у них есть 2D-массив. Они не. У них есть множество указателей, и это когда вы получите свой «рассеянный» макет. Ваш 2D массив int (*ptr)[3] = new int[2][3];
,
Во-первых, есть многомерные проблемы.
Во-вторых, если многомерная проблема «разреженная», не имеет смысла выделять 99 * 99 * 99 * 99 * … * 99 элементов, а только указатели на структуры следующего уровня, которые скрыты умным синтаксическим массивом [ п] [я] [J] [к] …
Например, виртуальная память и таблицы страниц работают в современных ОС и ЦП.
Существует два типа двумерных массивов:
1) вид, где вся память находится в одном большом блоке, и
2) вид, где каждая строка (или каждый столбец) является смежной, но отдельные строки разбросаны вокруг, и у вас есть массив указателей для указания на каждую строку.
Тип # 2 имеет лучшую производительность в случае, если вы хотите сделать определенные вещи, такие как обмен строк, потому что все, что вам нужно сделать, это поменять местами два указателя.