2010-11-07 49 views
3

我正在通過將字節複製到動態數組中來將文件讀入內存。目前,我每realloc()一個字節更大每次一個新的字節進來,這似乎效率低下。爲內存分配字符串的時間和內存有效的方法

有人建議(我不記得在哪裏),每次需要更多內存時加倍內存是件好事,因爲它是O(log n)分配時間,只有一半的內存不足的最壞情況未被使用。

有關內存分配的任何建議?

回答

6

如果要將整個文件加載到字符串中,則可以使用question中列出的方法。這樣你就可以以字節爲單位獲得文件的大小,並分配你的字符串來保存(不要忘記空字符的額外字節)。

但是,如果你動態地增長一個字符串,最好通過一個大於單個字節的因子來增加它的大小(重新分配一個字符串每個字節會很慢,特別是如果必須分配字符串在新的內存區域,然後複製)。由於您正在閱讀的文件翻倍,可能是非常合理的。我見過的人使用其他方法來做到這一點爲好,例如:

  1. 我看到人們輪2的下一個動力,例如2,4,8,然後16個字節。 (這基本上是每次文件大小的兩倍)。

  2. 我也看到人們使用的值更適合他們打算讀取的字符串,即。一次100個字節。

如果你重新分配字符串,你總是可以在最後重新分配內存以獲得所需的確切大小。

+2

我喜歡以2的冪減1的大小開始,然後雙-add-one每次我用完空間。這可確保新尺寸始終大於或等於舊尺寸,而不包括對未簽名包裝模SIZE_MAX + 1的任何特殊處理。簡單地加倍可能會導致從成功的SIZE_MAX/2 + 1字節緩衝區跳轉到成功的0字節緩衝區,並隨後發生堆破壞(假設系統的malloc(0)返回非NULL)。 – 2010-11-07 05:34:37

6

做一些建議(每次需要更多空間時,將緩衝區的大小乘以乘法因子)。我做了很多次,效果很好。如果你不喜歡兩個因素,你可以使用別的東西。我已經使用Phi(黃金比例)來取得良好效果。

+0

+1用於提及黃金比例 – Fabian 2010-11-07 10:28:46

2

我沒有這個在我面前的一個引用,它可能是一個實現特定的細節,但我相信,功率爲2的大小的指針是用來調整C++ STL的對象大小的string對象,因爲字符不斷添加。 (通過在添加字符時調用string::capacity方法來驗證這一點應該很容易。)