Комментарии 17
Я уж подумал что будут разбирать почему тривиальное транспонирование работает медленно и как его написать быстро, а оказалось что статья про B[i, j] = A[j, i].
Я уж подумал что будут разбирать, как можно эффективно поворачивать изображения с помощью векторных инструкций (SSE, AVX, AVX512) и нюансов работы кэша и сравнивать реализацию, например, с Intel MKL, а оказалось что статья про B[i, j] = A[j, i]. (простите меня тоже)
Простите, я не в тренде, но я для начала хотя бы думал, что автор понимает, почему в двумерном массиве "две звёздочки". Но нет, у автора "двумерный массив лежит в памяти одним блоком". Нет. В общем случае, не лежит.
Но в этом случае, вот это
Зная второй вариант, [skipped]. Например, он может быть полезен, когда нужно избавиться отлишних звездочекот указателей на указатели на указатели.
совершенно неправильно. «Указатели на указатели на указатели» появляются только в том случае, когда многомерный массив размерности n реализуется с помощью массива указателей на массивы с размерностью n-1. И, да, в этом случае данные массива будут разбросаны по памяти. Обычно это бывает при создании многомерного массива в куче при размерах массива, неизвестных на этапе компиляции. Хотя и в этом случае, если чуть-чуть напрячься и заморочиться с адресной арифметикой, можно написать класс, реализующий многомерный массив, данные которого будут лежать в куче единым блоком.
Примечание: создать массив размерностью высоты и ширины реального изображения на стеке не выйдет. Только на куче с помощью оператора new.
Хм, а функция alloca
тогда что делает?
Во-вторых, в данном случае, использование этой функции эквивалентно объявлению локальной переменной-массива. С теми же потенциальными граблями и, возможно, дополнительными ключами компиляции.
А оно надо?
Во-первых, такой функции нет в стандарте С++. Т.е. сразу непереносимо.
Вам шашечки или ехать? AVX-интринсиков тоже нет в стандарте C++, а их почему-то используют.
Во-вторых, в данном случае, использование этой функции эквивалентно объявлению локальной переменной-массива.
Да, с помощью C++ добиться высокой производительности, но можно и выстрелить в ногу.
Выкопал старые исходники (а то вдруг память подводит), примерно 93-го года сочинения. Была у меня там библиотека для работы с матрицами. И таки да, адресная арифметика, переопределение операторов и операции типа транспонирования… Помню, поражал препода лабораторкой, где в main было ((A+B)*C).print(); в те времена, когда новички писали это всё многосложными циклами.
К чему это я? Даже в те лохматые коды то, что описано автором, преподавалось в школе (пусть и не в каждой), как азы, в чистом виде не применимые в нормальной разработке.
И если уж у сферических новичков возникают проблемы с массивами, то не надо показывать циклы на уровне школьной арифметики. Им это не поможет.
преподавалось в школе (пусть и не в каждой), как азы, в чистом виде не применимые в нормальной разработке.
А с чего-то же надо начинать. Сомневаюсь, что какой-нибудь новичок сможет уже через месяц заниматься нормальной разработкой.
Демонстративно вертим массивы для новичков