delphi - 使用 IMAGE_FILE_LARGE_ADDRESS_AWARE 32 位 - 64 位

标签 delphi 32bit-64bit

我昨天了解到在 DelphiXE 中使用编译器指令:

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

即使 DelphiXE 编译器生成 32 位代码,您也可以在 64 位计算机上访问/使用 4GB 地址空间。

我今天在装有 Windows7 的 4GB 机器上尝试了 DelphiXE 程序,启动该程序后 我确实得到了以下结果:

  • 物理内存千字节数:~4.000.000KB
  • 可用物理内存千字节数:~3.200.000KB
  • 内存使用百分比:~20%
  • 虚拟地址空间千字节数:~4.000.000KB¡
  • 可用虚拟地址空间千字节数:~4.000.000KB

每次加载多个对象(表、字符串、列表、大量指针)后可用内存的数量 下降,这很好,直到所有内存都用完。一切都很好。但这里有一些问题:

1. 有时我得到的信息是程序使用硬盘而不是内存, 因为它减慢了速度(但内存仍然可用)。 那可能吗?如果是,当 RAM 仍然可用时,如何防止程序使用光盘? 或者也许一些临时文件被写入光盘?

  1. 相同的程序在 8G RAM 的机器上会发生什么? 32位程序可以使用全部8G吗? 我想不会,因为指针只有 32 位,而且它们可以访问的内容是有限的。

  2. 如果我用 64 位在 64 位机器上编译相同的程序 编译器(不幸的是,这是不可能的), 我的猜测是,在具有 4GRam 的机器上,64 位程序的可用 RAM 空间会更少 比启用“IMAGE_FILE_LARGE_ADDRESS_AWARE”的 32 位程序, 因为指针是 64 位的,因此它们本身就比 32 位指针花费了更多的空间。 我的想法完全错误吗?

感谢您的回复。

最佳答案

是的,如果操作系统认为有必要,会将部分虚拟内存(称为 RAM)交换到页面文件。

32 位程序将无法使用超过 4 GB(即使在 64 位 Windows 上),并且最终,由于指针大小(内部 32 位), native 64 位程序不会使用比 32 位程序更多的内存指针在 x64 窗口中是 64 位指针)。

附注:如果您设置了 Large Address Aware 开关,您应该真正确定您的应用程序(包括 vcl、delphi 单元和组件)可以处理 > 2 GB 的地址。例如,将指针强制转换为整数是不允许的。当然还有更多的陷阱。

关于delphi - 使用 IMAGE_FILE_LARGE_ADDRESS_AWARE 32 位 - 64 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3980806/

相关文章:

performance - Phpstorm 超慢 - 282.8% CPU 使用率

在 Windows 7 上测试软件。安装与虚拟化

c - 将 Fortran/C 程序从 32 位升级到多体系结构

qt - 使用 QMAKE 构建 32 位和 64 位版本的项目

delphi - 将鼠标环绕屏幕边缘

delphi - 当我使用完 SQLite DLL 后,如果操作系统认为它仍在使用中,如何删除它?

delphi - 在使用运行时包构建时,如何让我的程序使用更少的内存?

delphi - 从TStringGrid单元格[aCol,aRow]读取文本,该文本由DrawText函数在“OnDrawCell”事件上生成

delphi - 变体记录的 Rtti

64 位架构中的汇编寄存器