我昨天了解到在 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 仍然可用时,如何防止程序使用光盘? 或者也许一些临时文件被写入光盘?
相同的程序在 8G RAM 的机器上会发生什么? 32位程序可以使用全部8G吗? 我想不会,因为指针只有 32 位,而且它们可以访问的内容是有限的。
如果我用 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/