Ist die Verwendung von realloc () in einem dynamisch zugewiesenen 2D-Array eine gute Idee?

Ich interessiere mich hauptsächlich für die Rentabilität vonSchrumpfun solch ein Array.

Ich arbeite an einem Projekt, in dem ich einzelne malloc () -Aufrufe verwendet habe, um einzelne mittelgroße 2D-Arrays zu erstellen. (Jeweils höchstens einige zehn MiB.) Das Problem ist, dass der Inhalt eines Arrays im Laufe seiner Lebensdauer dramatisch an Größe verliert (um mehr als die Hälfte). Natürlich könnte ich die Array-Größe für die gesamte Laufzeit des Programms in Ruhe lassen. (Es ist nur einx MiB auf einem System mit GiB verfügbarem RAM.) Wir sprechen jedoch davon, dass mehr als die Hälfte des zugewiesenen Speicherplatzes ungenutzt bleibt, lange bevor das Programm endet, und dass aufgrund der Art und Weise, wie ich das Array verwende, alle Überlebende Daten werden in einer zusammenhängenden Reihe von Zeilen (am Anfang des Blocks) aufbewahrt. Es scheint eine Verschwendung zu sein, an all dem RAM festzuhalten, wenn ich ihn wirklich nicht brauche.

Während ich weiß, dass realloc () verwendet werden kann, um dynamisch erstellte Arrays zu verkleinern, ist ein 2D-Array komplexer. Ich denke, ich verstehe das Speicherlayout davon (während ich die Funktion implementiere, die es strukturiert), aber dies erweitert die Grenzen meines Verständnisses der Sprache und der Arbeitsweise seiner Compiler. Natürlich müsste ich mit Zeilen arbeiten (und mich mit den Zeilenzeigern befassen), nicht nur mit Bytes, aber ich weiß nicht, wie vorhersehbar das Ergebnis all dessen wäre.

Und ja, ich muss das Array mit einem einzelnen malloc () erstellen. Das betreffende Objekt hat mehrere Millionen Zeilen. Ich habe versucht, jede Zeile einzeln mit einer Schleife zu malloc (), aber das Programm ist immer bei etwa 100.000 malloc () eingefroren.

Für den Hintergrund verwende ich die folgende Quelle, um dieses Array zu erstellen:

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage