perfect_genius
@perfect_genius
Неостановимый генератор идей по улучшению мира

Почему непопулярен динамический многомерный массив?

Динамический двумерный массив (или вектор векторов, не суть) - это одномерный динамический массив указателей на одномерные динамические массивы произвольной длины. Но можно создать динамический одномерный массив и обращаться к нему как к двумерному (тогда длина строк будет уже фиксированной), но это будет через костыли типа (((*int)массив)[1])[1] или что-то такое визуально страшное. Я стараюсь следить за новыми стандартами Си и С++, но на этот счёт ничего не вижу, т.е. такие массивы почему-то непопулярны, да? Или же я что-то пропустил в стандартах?
Ведь по идее, производительность с такими массивами выше, чем доступ через лишние указатели, взамен фиксированности длин строк, но динамичности длин столбцов.
...кстати, мощный удар по производительности будет, если при увеличении размера этого массива придётся перевыделять память и всё это туда копировать, тогда как массив указателей будет значительно меньше.
  • Вопрос задан
  • 206 просмотров
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Случай, когда у вас динамически добавляются новые строки, но все они фиксированной длины - редок. Да и в этом случае можно завести vector из array'ов. Ничего городить нового, тем более в стандартах, не надо.

Если же добавляются и строки и столбцы, то такая структура будет не оптимальна, ведь на каждый чих надо перетасовывать все данные в памяти. Вектор векторов тут будет быстрее при изменении размера.

Но, да, итерация как бы медленнее будет. Но не на много. В одном случае у вас лишняя адресация, а в другом - умножение. И там и там есть обращение к памяти лишнее, но в векторе векторов - читаются данные из массива указателей, а в плоской структуре - одна и та же длина строк. Ну и данные не так локально в векторе лежат. В целом не стоит эта проблема особого внимания.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
Если вы знаете, как положить свой алгоритм на банальный кусок памяти и сделать это быстро - так тут, как вы верно заметили, ничего настолько сложного, чтобы изобретать для этого новые стандарты, просто нет. На Крестах это будет класс в один экран максимум, да и на Сях, емнип, многомерные массивы так и организованы - память одним куском, просто арифметика убрана под капот.
Ответ написан
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
Потому что в том месте, где появляются динамические многомерные массивы (которые, как верно замечено - суть массив указателей) - через весьма небольшое время появляются городушки, которые очень быстро приводят к плюсам.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы