约c:64bit内存分配

约c:64bit内存分配

64bit Memory allocation

我被要求在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位的Compiler Preview,预计将于2011年上半年发布。


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


为了分配由多个进程共享的内存,应使用内存映射文件。

http://www.delphifaq.com/faq/delphi_windows_API/f348.shtml上可用的代码可用于在32位和64位进程之间进行通信。

步骤如下:

  • 在磁盘上或在内存上创建一个内存映射文件;
  • 创建一个互斥体以通知文件更改;
  • 一端将一些数据写入内存映射文件;
  • 然后标记互斥体;
  • 另一端收到互斥通知;
  • 然后,它从内存映射文件中读取数据。

由您决定在内存映射文件中创建自定义二进制布局,以便共享任何数据。

根据设计,内存映射文件速度很快(这是内核级/ x86 CPU功能),并且可以处理巨大的内存(根据我的实验,一个32位进程最多可以使用1 GB)。

http://cc.embarcadero.com/Author/802978使用这种通信方式从32位Delphi程序中调用任何64位dll。


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


推荐阅读