Почему непопулярен динамический многомерный массив?
Динамический двумерный массив (или вектор векторов, не суть) - это одномерный динамический массив указателей на одномерные динамические массивы произвольной длины. Но можно создать динамический одномерный массив и обращаться к нему как к двумерному (тогда длина строк будет уже фиксированной), но это будет через костыли типа (((*int)массив)[1])[1] или что-то такое визуально страшное. Я стараюсь следить за новыми стандартами Си и С++, но на этот счёт ничего не вижу, т.е. такие массивы почему-то непопулярны, да? Или же я что-то пропустил в стандартах?
Ведь по идее, производительность с такими массивами выше, чем доступ через лишние указатели, взамен фиксированности длин строк, но динамичности длин столбцов.
...кстати, мощный удар по производительности будет, если при увеличении размера этого массива придётся перевыделять память и всё это туда копировать, тогда как массив указателей будет значительно меньше.
Случай, когда у вас динамически добавляются новые строки, но все они фиксированной длины - редок. Да и в этом случае можно завести vector из array'ов. Ничего городить нового, тем более в стандартах, не надо.
Если же добавляются и строки и столбцы, то такая структура будет не оптимальна, ведь на каждый чих надо перетасовывать все данные в памяти. Вектор векторов тут будет быстрее при изменении размера.
Но, да, итерация как бы медленнее будет. Но не на много. В одном случае у вас лишняя адресация, а в другом - умножение. И там и там есть обращение к памяти лишнее, но в векторе векторов - читаются данные из массива указателей, а в плоской структуре - одна и та же длина строк. Ну и данные не так локально в векторе лежат. В целом не стоит эта проблема особого внимания.
Нет, в моём случае добавляются и удаляются только строки. Делаю виртуальную машину с опкодами фиксированной длины. Скорость добавления новой инструкции не так важна, как скорость доступа к ним для исполнения.
Насчёт страшного синтаксиса я прав (((*int)массив)[1])[1]) или же есть что-то попроще для глаз, особенно в С++?
Но вообще, в вашем случае с опкодами, гораздо логичнее может быть иметь не массив массивов, а массив структур. Ведь опкоды не спроста одинаковую фиксированную длину имеют, там какая-та структура есть.
Если вы знаете, как положить свой алгоритм на банальный кусок памяти и сделать это быстро - так тут, как вы верно заметили, ничего настолько сложного, чтобы изобретать для этого новые стандарты, просто нет. На Крестах это будет класс в один экран максимум, да и на Сях, емнип, многомерные массивы так и организованы - память одним куском, просто арифметика убрана под капот.
А нельзя как-нибудь попроще, поближе к "массив[i][j]"?
Ведь пока не наведёшь курсор на "массив", можно и не знать - статический он или динамический, что удобно для глаз.
Роман Романов, надо попроще - используй контейнеры STL и нечего лохматить бабушку.
Оптимизация попроще не бывает, она, наоборот, требует очень глубокого понимания, что происходит, будет происходить и может происходить.
Adamos, не понял что за "оптимизация попроще", когда я просил такой же простой синтаксис, какой уже есть для подобных массивов. Так приведите пример с контейнером, пожалуйста.
Потому что в том месте, где появляются динамические многомерные массивы (которые, как верно замечено - суть массив указателей) - через весьма небольшое время появляются городушки, которые очень быстро приводят к плюсам.