我知道我可以使用VirtualAlloc保留虛擬內存。
例如我可以聲稱1GB的虛擬內存,然後調用第一個MB來放入一個增長的數組。
當數組增長超過1MB時,我在第二個MB中調用,等等。
這種方式我不需要在內存中移動陣列,它只是保持原樣,Intel/AMD虛擬內存管理器會照顧我的問題。FastMM是否支持保留虛擬內存和調用塊來增長數組?
但FastMM是否支持這種結構,所以我不必自己做內存管理?
僞代碼:
type
PBigarray = ^TBigarray;
TBigArray = array[0..0] of SomeRecord;
....
begin
VirtualMem:= FastMM.ReserveVirtualMemory(1GB);
PBigArray:= FastMM.ClaimPhysicalMemory(VirtualMem, 1MB);
....
procedure GrowBigArray
begin
FastMM.ClaimMorePhysicalMemory(PBigArray, 1MB {extra});
//will generate OOM exception when claim exceeds 1GB
不FastMM支持呢?
這有一個[XY問題]的特點(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。我在猜測你真正的問題是什麼,但我懷疑你正在遭受地址空間碎片化,因爲你的代碼需要大量連續的內存塊。如果是這樣的話,最好的解決方案是分配非連續的塊,然後*將它們拼接在一起*在幕後,這樣這些較小的塊看起來像是連續的塊。 – 2011-06-17 11:53:42