我主要感興趣的是收縮這樣一個數組的生存能力。在動態分配的二維數組上使用realloc()是個好主意嗎?
我正在使用單個malloc()調用來創建個別中等大小的2D數組的項目。 (每個數組最多隻有幾十個MiB)。事情是,在其中一個陣列的整個生命週期中,其內容的大小會急劇縮小(超過一半)。很明顯,我可以在程序的整個生命週期內保留數組大小。 (這只是一個x MiB在一個帶有可用RAM的GiB的系統上)。但是,在程序終止之前,我們正在談論的是超過一半的分配空間被濫用,並且由於我的性質使用該數組,所有幸存的數據保存在連續的一組行中(在塊的開始處)。如果我真的不需要它,保留所有RAM似乎是一種浪費。
雖然我知道realloc()可以用來收縮動態創建的數組,但2D數組更復雜。我認爲我理解它的內存佈局(因爲我實現了構建它的函數),但是這推動了我對語言和編譯器工作的理解的極限。顯然,我將不得不使用行(並處理行指針),而不僅僅是字節,但我不知道這一切的結果會是多麼可預測。
而且,是的,我需要用一個malloc()創建數組。有問題的對象有幾百萬行。我試着用malloc()分別循環每行,但程序總是凍結在10萬個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;
}
'realloc'對於這樣的大桌不是一個好主意,請看看「avl」和「red-black」樹。 –
「如果我真的不需要它,保留所有內存似乎是一種浪費。」 - 首先*個人資料*。其次,realloc會觸發將所有靜態內部數據複製到不同頁面的高風險,您承擔的非平凡費用僅僅是因爲試圖保存自己聲稱的ram而不是真正的問題。這裏唯一的勝利場景是'realloc'保持與你的內存基地相同的區域頭部,並且尾部頁面被返回用於其他用途;一些'realloc'沒有關於...的保證。 – WhozCraig
...所以你有沒有考慮過只是做2(或3或4,不管)分配,記住你最終保留的是哪一個,'free()' - 一旦事件發生,你不再需要的那些?即你的矩陣的「保留」一半在第一個分配中,下半部分在另一個分配中,最終你可以釋放下半部分。 – WhozCraig