Использование многомерных массивов таким образом в C "неоптимально" для производительности.
В непонятных словах: Пожалуйста, не используйте - и определенно не инициализируйте - многомерные массивы, как вы иллюстрировали. Многократные вызовы malloc()
создадут вам группу непересекающихся областей памяти, которые плохо сопоставляется с тем, как фактическая графика (как смежные, одиночные буферы) хранится где-либо. Кроме того, если вам придется делать это сотни или тысячи раз, malloc()
может быть ужасно дорогим.
Кроме того, из-за того, что вы очень часто используете malloc (), это также кошмар (и ошибка, которая может вас укусить) для очистки. Вы даже упомянули это в комментариях к вашему коду, и все же ... почему?
Если вам абсолютно необходимо иметь это ptr[rows][cols]
, создайте его лучше, как это:
signed char alloc_2D_pixels(unsigned char*** memory,
unsigned int rows,
unsigned int cols)
{
int colspan = cols * sizeof(char);
int rowspan = rows * sizeof(char*);
unsigned char **rowptrs = *memory = malloc(rowspan + rows * colspan));
/* malloc failure handling left to the reader */
unsigned char *payload = ((unsigned char *)rowptrs) + rowspan;
int i;
for (i = 0; i < rows; payload += colspan, i++)
rowptrs[i] = payload;
}
таким образом, вы выделяете только один блок памяти, и все это может быть освобождено за один раз - ровно free_2D_pixels()
.