64位内存分配

时间:2020-03-05 18:44:56  来源:igfitidea点击:

我被要求在C ++中创建一个与Delphi兼容的dll,以进行简单的64位内存管理。

背景是Delphi中的系统需要分配大量的内存块,这些内存块可以很好地进入32位可寻址空间之外。 Delphi开发人员向我解释说,他无法使用可用的Delphi命令分配内存。他说他可以保留64位地址,因此他只想调用我提供的函数来分配内存并向他返回64位指针。然后是另一个功能,以后可以释放内存。

现在,我只能使用VS 2008,因此首先我什至不确定我是否可以首先创建与Delphi兼容的dll。

任何Delphi专家都愿意帮助我。也许有一种方法可以实现他所需要的而无需重新发明轮子。其他开发人员必须在Delphi中遇到过这种情况。

所有评论表示赞赏。

解决方案

回答

只有64位进程可以寻址64位内存。 64位进程只能加载64位dll,而32位进程只能加载32位dll。 Delphi的编译器只能生成32位二进制文​​件。

因此,32位Delphi exe无法加载64位c ++ dll。它可以加载32位c ++ dll,但是该dll无法处理64位内存空间。我们有点被这种解决方案所困扰。

使用正确的编译器选项和Windows开关,Delphi可以毫无问题地寻址3GB的内存。如果使用物理地址扩展,则32位进程甚至可以访问更多内存。然后,它需要通过使用地址窗口扩展来在32位内存中换入和换出内存页面。

回答

Delphi指针是32位的。时期。Delphi开发人员也许可以"存储"我们要返回给他的64位值,但是他无法访问它们指向的内存,所以这是徒劳的。

以前,我写过:-

A 64-bit version of Delphi is on
  Codegear/Embarcadero's road map
  for "middle of 2009". Product quality
  seems to be (at last!) taking
  precedence over hitting ship dates
  exactly, so don't hold your breath...

但是,在2010年8月,Embarcadero在此处发布了新的路线图。它没有给出具体日期,但是提到了64位编译器预览版,预计将于2011年上半年发布。

回答

我们可能还希望添加一种方法来将该64位指针固定和取消固定到32位内存地址。由于这是Delphi,因此我非常确定它是Windows特定的,因此我们不妨使用"地址窗口扩展"。这样,我们可以支持将内存分配,释放以及固定和取消固定到32位地址范围,并且仍然利用64位内存分配空间。假设用户将实际提交内存,使其适合32位虚拟地址空间。

回答

我们可能会看看Free Pascal,因为它包括64位版本,并且大多数都是与Delphi兼容的语法。