gpt4 book ai didi

delphi - FastMM 是否支持保留虚拟内存并调用 block 来增长数组?

转载 作者:行者123 更新时间:2023-12-02 11:05:59 24 4
gpt4 key购买 nike

我知道我可以使用 VirtualAlloc 保留虚拟内存。
例如我可以申请 1GB 虚拟内存,然后调用其中的第一个 MB,将不断增长的数组放入其中。
当数组增长超过 1MB 时,我会调用第 2MB,依此类推。
这样,当阵列增长时,我不需要在内存中移动阵列,它只是保持在原位,Intel/AMD 虚拟内存管理器会解决我的问题。

但是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 支持这个吗?

最佳答案

不,FastMM4(截至我查看的最新版本)没有明确支持这一点。这确实不是您所期望的通用内存管理器中的功能,因为使用 VirtualAlloc 调用非常简单。

NexusMM4(NexusDB 的一部分)所做的事情可以为您提供类似的结果,但不会在后台需要它之前浪费所有地址空间。

如果您进行初始大量分配(直接通过 GetMem,或间接通过动态数组等),则通过 VirtualAlloc 分配所需大小的内存。

但是,如果该分配随后调整为更大的大小,NexusMM 将使用不同的方式来分配内存,这使得它可以简单地从地址空间取消映射分配,并在进一步重新分配时以更大的大小再次重新映射它地方。

这可以防止大多数通用内存管理器在重新分配时遇到的两个主要问题:

  • 在正常重新分配期间,现有分配和新分配需要同时存在于地址空间中,暂时使地址空间和物理内存需求加倍
  • 在正常重新分配期间,需要复制现有分配的全部内容

因此,使用 NexusMM,您只需使用普通的 GetMem/ReallocMem 即可获得伪代码中显示的所有优点(除了第一个 realloc 将涉及副本,并且增加数组可能会更改其地址)/FreeMem 调用。

关于delphi - FastMM 是否支持保留虚拟内存并调用 block 来增长数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6385237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com