int>?
row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * height);
for (y=0; y<height; y++)
row_pointers[y] = (png_byte*) malloc(png_get_rowbytes(png_ptr,info_ptr));
png_read_image(png_ptr, row_pointers);
размер должен быть известен в момент компиляции
У std::array<> нет vla
Если хочешь заменить на использование какого-то контейнера то используй vector в случае с динамическим массивом
А вообще такое лучше делать одним единственным вектором, а не массивом указателей на массивы.
А зачем ты в сайзоф тип пихаешь? Гораздо ж удобнее (sizeof *row_pointers * height)
Это не я. Это пример от разработчиков libpng.
Картинку хранить в одномерном массиве? Зачем?
На плюсы переписать хочешь?
Да. (Программу, а не либу)
Чтобы не плодить индирекции?
затем, что подряд в памяти
Ну в теории оно создаст массив указателей на массивы, а потом и так эти самые массивы подряд. Я же сразу память выделяю, а куча почти всегда линейно растет .
Представьте, как это будет лежать в памяти. А потом представьте, что вам не по строкам, а по столбца посмотреть значения надо будет.
"Сразу" это очень интересное слово в данном случае. Разве что ваше приложение — это либо ОС, либо bare metal.
Эм... А в чем проблема? Тот массив, который номер элемента - менять не буду, а буду менять номер указателя.
В том, что строка 1 и строка 2 могут лежать в абсолютно разных уголках вашей памяти. А строка 3 между ними.
Ну даже если оно не по-порядку лежит в памяти? Что плохого-то?
Почитайте про кэш и про индирекции для начала. А то начинает напоминать пересказ книги
Гуглить про устройство подсистемы памяти процессора и кэши
У процессора кэша вообще может не быть
какие-то мифические процессоры в вакууме )
Ну даже у 486 его не было
Точнее не всегда
никто не спорит что в теории такое может быть, и даже бывает в реальности
.
Это не та задача, которую вы не можете решить
В процессе вылезло уже куча деталей, которые известны только вам, кто знает, сколько их еще? А собирать в кучу и формулировать то, что вам нужно, никому не надо кроме вас самого
никак. в таких случая используют std::vector<uint8_t>
Что бы повысить cache locality
Обсуждают сегодня