如何编写一个内存管理器,为Delphi映射4 GB的内存

4

我有一个使用超过2GB虚拟内存的对象,但Delphi只能管理2GB。我正在考虑创建多个对象并将它们分组,然后以某种方式使用Windows wow64方法并使用64位Windows。或者只需将内存管理器升级到4GB并围绕Int64构建它。有效地,我需要以Int64为基础对象使用TStream,而不是整数。


14
既然您的所有旧账户都已经合并成一个,请使用它好吗?也就是说,每次不要创建新的 "lexdean" 账户,而是用现有的账户 "lexdean" 登录。 - mghie
啊,不知道为什么在编辑之前没有看日期 - 希望有一种有效的方法可以“撤销”您的编辑.... - Leonardo Herrera
4个回答

14

Lexdean,你的意思是:

实际上我需要TStream作为基对象,使用Int64而不是整数

那么,你很幸运(两次),因为:

  1. Delphi的TStream使用Int64作为位置,可以访问比4Gb大得多的文件。
  2. 如果TStream接口足够了,你可以编写自己的TStream以执行任何操作,不需要等待原生64位Delphi编译器。

但是,如果我要回答标题中的问题:

如何编写一个内存管理器,将4吉字节映射到Delphi

没有办法使用32位编译器做到这一点。加入请求64位Delphi编译器的人群吧!


http://delphi.uservoice.com/forums/4432-general/suggestions/143779-64-bit-support ;) (注:这是一个链接,无法翻译) - Alex
1
现在我认为x64编译器不是一个好主意:现在人们会开始分配4-6 GB的内存,而不考虑尝试不同的方法... :D - Alex

5

拥有一个单独的2GB对象并不是一个好主意。如果内存被分割,即使有足够的空闲内存,你也无法分配一个这么大的对象。我建议您尝试使用一系列较小的对象。

(我记得在Turbo Pascal(Delphi的前身)中,变量大小不能超过64KB...哦,那个时代... ;))


4
很遗憾目前还没有编译64位代码的Delphi编译器。但是,如果在DPR中添加{$SetPeFlags IMAGE_FILE_LARGE_ADDRESS_AWARE},您可以更充分地利用32位地址空间。它会在PE头中设置一个标志,让Windows知道它可以为其分配超过2GB的虚拟内存。
不过,Guffa说得对。如果您的对象试图获取2GB以上的连续内存,则可能存在问题。您想做什么?也许有更简单的方法...

2
IMAGE_FILE_LARGE_ADDRESS_AWARE要求在32位机器上也需要/3GB Windows开关,或者是64位操作系统。 - user160694
Alex已经有了答案, 我们必须调查而不只是考虑限制/规则/法律。Lex Dean - lexdean

2
你可以使用AWE API在win32应用程序中获得更多的内存。但是你需要围绕AWE编写代码,而不是为你的代码适应AWE的使用方式。我的意思是你可以编写TAWEMemoryStream...但这不是一个好主意。

谢谢Alex,你给了我非常需要的答案。 就是这个。 非常感谢。 - lexdean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接