64位内存分配

时间:2008-08-29 09:57:25

标签: c++ delphi memory 64-bit

我被要求用C ++创建一个Delphi兼容的dll来进行简单的64位内存管理。

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

现在,我只能使用VS 2008,所以首先我甚至不确定我是否可以创建一个兼容Delphi的dll。

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

所有评论都表示赞赏。

5 个答案:

答案 0 :(得分:7)

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

因此32位Delphi exe无法加载64位c ++ dll。它可以加载一个32位的c ++ dll,但那个dll将无法处理64位的内存空间。你有点坚持这个解决方案。

Delphi可以使用正确的编译器选项和Windows开关来解决3GB的内存问题。如果使用Physical Address Extension,则32位进程可以访问更多内存。然后,它需要通过使用Address Windowing Extensions来交换存储器页面进出32位存储器。

答案 1 :(得分:6)

Delphi指针是32位的。期。您的Delphi开发人员可能能够“存储”您想要返回给他的64位值,但他无法访问他们指向的内存,因此这非常徒劳。

以前,我写过: -

  

启用了64位版本的Delphi   Codegear/Embarcadero's road map   为“2009年中期”。产品质量   似乎(终于!)正在服用   击中发货日期的优先顺序   确切地说,所以不要屏住呼吸......

但是,2010年8月,Embarcadero发表了new roadmap here。这没有给出具体日期,但提到 64位编译器预览预计可用性,2011年上半年

答案 2 :(得分:5)

您可以查看Free Pascal,因为它包含64位版本,并且主要是Delphi兼容语法。

答案 3 :(得分:4)

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

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。

答案 4 :(得分:2)

您可能还想添加一种方法来固定和取消固定该64位指针到32位内存地址。由于这是Delphi,我很确定它是特定于Windows的,所以你不妨使用Address Windowing Extensions。这样,您可以支持分配,释放,固定和取消固定内存到32位地址范围,并仍然利用64位内存分配空间。假设用户实际上将提交内存,使其适合32位虚拟地址空间。