Когда я использовал C ++ в колледже, мне посоветовали использовать многомерные массивы (далее MDA), когда это возможно, поскольку он демонстрирует лучшую локальность памяти, так как он выделяется одним большим блоком. С другой стороны, массив массивов (AoA) распределяется по нескольким более мелким кускам, возможно, разбросанным по всей физической памяти, где бы ни находились вакансии.
Итак, я предполагаю, что первый вопрос: это миф или этому совету стоит следовать?
Если предположить, что это последнее, то следующий вопрос будет заключаться в том, что делать на таком языке, как Java, у которого нет настоящего MDA. Конечно, не так уж и сложно подражать MDA с помощью 1DA. По сути, то, что является синтаксическим сахаром для языков с MDA, может быть реализовано как поддержка библиотек для языков без MDA.
Стоит ли это усилий? Это слишком низкий уровень проблемы оптимизации для такого языка, как Java? Должны ли мы просто отказаться от массивов и использовать List даже для примитивов?
Другой вопрос: в Java, может ли выделение AoA сразу (new int[M][N]) привести к другому распределению памяти, чем при иерархическом (new int[M][]; for (... new int[N])?