使用IMAGE_FILE_LARGE_ADDRESS_AWARE 32位 - 64位

时间:2010-10-20 17:53:19

标签: delphi 32bit-64bit

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

{$ SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

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

我今天尝试使用Windows7的4GB机器和启动程序后的DelphiXE程序 我真的得到以下结果:

  • 物理内存的Kbytes:~4.000.000KB
  • 自由物理内存的Kbytes:~3.200.000KB
  • 使用中的内存百分比:~20%
  • 虚拟地址空间的千字节:~4.000.000KB¨
  • 空闲虚拟地址空间的千字节:~4.000.000KB

每次加载几个对象(表,字符串,列表,很多指针)之后,就会释放出可用内存 下来,什么是好的,直到所有的记忆都被使用。一切都很好。但这里有一些问题:

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

  1. 使用8G Ram的机器上的相同程序会发生什么? 32位程序能够使用所有8G吗? 我想不是因为指针只有32位而且它们可以访问的限制。

  2. 如果我在64位机器上用64位编译相同的程序 编译器(不可能还不幸的是), 我的猜测是,在4GRam的机器上,64位程序可用的可用RAM空间较少 启用“IMAGE_FILE_LARGE_ADDRESS_AWARE”的32位程序, 因为指针是64位,因此它们单独花费的空间比32位指针多。 我认为完全错了吗?

  3. 感谢您的回复。

2 个答案:

答案 0 :(得分:4)

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

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

并注意:如果您设置了大地址识别开关,您应该确定您的应用程序(包括vcl,delphi单元和组件)可以处理地址> 2 GB。例如,转换指向Integer的指针是不允许的。当然还有更多的陷阱。

答案 1 :(得分:1)

64位应用程序使用的内存多于32位应用程序,因为某些数据类型将是64位长而不是32位(不仅仅是指针 - 这取决于应用程序使用的数据类型和编译器标准类型)。一些指令可能还需要更多的字节进行编码。因为UTF-16字符串需要比ANSI更多的空间。 当然,如果你必须操纵大型64位结构,那么使用只有4GB RAM的64位机器并不是一个好主意。使用64位操作系统的原因之一是管理超过4GB而不使用任何分页技巧。