Является ли использование realloc () для динамически размещаемого 2D-массива хорошей идеей?

В основном меня интересует жизнеспособностьсокращение такой массив.

Я работаю над проектом, в котором я использовал одиночные вызовы malloc () для создания отдельных умеренно больших двумерных массивов. (Каждое всего несколько десятков МиБ, самое большее.) Дело в том, что за время жизни одного из массивов его содержание резко уменьшается в размере (более чем вдвое). Очевидно, я мог бы просто оставить размер массива на всю жизнь программы. (Это толькоx MiB в системе с доступным GiB оперативной памяти.) Но мы говорим о том, что более половины выделенного пространства выходит из употребления задолго до завершения программы, и из-за особенностей использования массива все выжившие данные хранятся в непрерывном наборе строк (в начале блока). Кажется, что тратить всю эту оперативную память на трату, если она мне действительно не нужна.

Хотя я знаю, что realloc () может использоваться для сжатия динамически создаваемых массивов, двумерный массив является более сложным. Я думаю, что понимаю структуру памяти (поскольку я реализовал функцию, которая структурирует ее), но это раздвигает границы моего понимания языка и работы его компиляторов. Очевидно, мне придется работать со строками (и иметь дело с указателями строк), а не только с байтами, но я не знаю, насколько предсказуемым будет результат всего этого.

И да, мне нужно создать массив с одним malloc (). У рассматриваемого объекта есть несколько миллионов строк. Я пытался использовать цикл для malloc () каждой строки в отдельности, но программа всегда зависала со скоростью около 100 000 malloc ().

Для фона, источник, который я использую для создания этого массива, выглядит следующим образом:

char ** alloc_2d_arr(int cnum, int rnum) {
        /* ((bytes for row pointers + (bytes for data)) */
        char **mtx = malloc(rnum * sizeof (char *) + rnum * cnum * sizeof (char));

        /* Initialize each row pointer to the first cell of its row */
        char *p = (char *) (mtx + rnum);
        for (int i = 0; i < rnum; i++) {
                mtx[i] = p + i * cnum;
        }

        return mtx;
}

Ответы на вопрос(1)

Ваш ответ на вопрос