2016-03-08 76 views
2

我从这里的其他帖子了解到“IMAGE_FILE_LARGE_ADDRESS_AWARE”可能有效地扩展了内存的可用性。德尔福2007年。应该在Delphi6中使用“IMAGE_FILE_LARGE_ADDRESS_AWARE”以有效避免EOutOfMemory错误?

我不明白这是在德尔福6工作,这确实是这样,或者它应该工作?还是有一个替代命令可以做同样的事情吗?

如果不是,我可能需要迁移到Delphi的更高版本。那么,有没有人知道最新版本的Delphi是什么,可以轻松让我迁移我现有的代码(理想情况下,我现有的代码,这是相当简单的Turbo Pascal类型的代码,将工作原样)AND将支持'IMAGE_FILE_LARGE_ADDRESS_AWARE''trick'扩展内存?

非常感谢!

REMCO

+0

虽然很难说明显,但也可能值得确认没有内存泄漏或堆腐败问题等。如果您不确定为什么内存不足,那么它非常重要你明白原因。如果您知道您对该内存有合理的需求,则通过在其上放置更大的地址空间来解决问题只会起作用。即使这种需求是合理和必要的,但通过简单的重构,通过改变您的分配和使用策略,可以显着减少应用程序中的内存压力。 –

回答

8

您可以将IMAGE_FILE_LARGE_ADDRESS_AWARE PE标志,以一个Delphi 6应用程序,但你必须提防以下问题:

  • 德尔福6默认的内存管理器,Borland的内存管理器,不支持地址大于2GB的内存分配。您必须将内存管理器替换为支持大地址的内存管理器。例如FastMM。
  • 您的代码可能包含需要找到并修复的指针截断错误。
  • 这同样适用于您使用的任何第三方软件。这包括Borland RTL和VCL库。我没有遇到这些库的许多问题,但可能是您的程序使用了运行时库的具有指针截断错误的不同部分。
  • 为了在大地址条件下对程序进行压力测试,您应该打开top down memory allocation。如果您在以自顶向下的内存分配模式运行时必须禁用您的反恶意软件(或者其他系统级软件),请不要惊讶。这种类型的软件在自顶向下的内存分配模式下运行时出了名。
  • 最后,值得指出的是,大地址感知无法解决所有内存不足的问题。它所做的只是打开32位地址空间的上半部分。你的程序可能需要更多的地址空间。在这种情况下,您需要重新设计程序,或转移到64位编译器。