É uma boa ideia usar realloc () em uma matriz 2D alocada dinamicamente?

Estou interessado principalmente na viabilidade deencolhendo tal matriz.

Estou trabalhando em um projeto em que usei chamadas malloc () únicas para criar matrizes 2D individuais moderadamente grandes. (Cada uma das poucas dezenas de MiB, no máximo.) O fato é que, ao longo da vida de uma das matrizes, seu conteúdo diminui drasticamente em tamanho (em mais da metade). Obviamente, eu poderia deixar o tamanho da matriz em paz durante toda a vida do programa. (É apenas umax MiB em um sistema com GiB de RAM disponível.) Mas, estamos falando de mais da metade do espaço alocado caindo em desuso muito antes do término do programa e, devido à natureza de como estou usando a matriz, todos os sobreviventes os dados são mantidos em um conjunto contíguo de linhas (no início do bloco). Parece um desperdício manter toda essa memória RAM, se eu realmente não precisar.

Embora eu saiba que realloc () pode ser usado para reduzir matrizes criadas dinamicamente, uma matriz 2D é mais complexa. Acho que entendo o layout da memória (como implementei a função que a estrutura), mas isso está empurrando os limites do meu entendimento da linguagem e do funcionamento de seus compiladores. Obviamente, eu teria que trabalhar com linhas (e lidar com os ponteiros de linha), não apenas com bytes, mas não sei quão previsível seria o resultado disso tudo.

E, sim, preciso criar a matriz com um único malloc (). O objeto em questão possui vários milhões de linhas. Tentei usar um loop para malloc () cada linha separadamente, mas o programa sempre congelava em cerca de 100.000 malloc () s.

Para segundo plano, a fonte que estou usando para construir essa matriz é a seguinte:

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;
}

questionAnswers(1)

yourAnswerToTheQuestion