Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 使用图像\u文件\u大\u地址\u感知32位-64位_Delphi_32bit 64bit - Fatal编程技术网

Delphi 使用图像\u文件\u大\u地址\u感知32位-64位

Delphi 使用图像\u文件\u大\u地址\u感知32位-64位,delphi,32bit-64bit,Delphi,32bit 64bit,我昨天了解到,在DelphiXE中,使用编译器指令: {$SetPEFlags图像\文件\大\地址\感知} 即使DelphiXE编译器生成32位代码,您也可以在64位计算机上访问/使用4GB地址空间 我今天在Windows7的4GB机器上尝试了DelphiXE程序,并且在启动该程序之后 我真的得到了以下结果: 物理内存的KB:~4.000.000KB KB的可用物理内存:~3.200.000KB 正在使用的内存百分比:~20% KB的虚拟地址空间:~4.000.000KB– 可用虚拟地址空间的K

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

{$SetPEFlags图像\文件\大\地址\感知}

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

我今天在Windows7的4GB机器上尝试了DelphiXE程序,并且在启动该程序之后 我真的得到了以下结果:

物理内存的KB:~4.000.000KB KB的可用物理内存:~3.200.000KB 正在使用的内存百分比:~20% KB的虚拟地址空间:~4.000.000KB– 可用虚拟地址空间的KB:~4.000.000KB 每次加载几个对象后,表、字符串、列表、大量指针都会占用大量的可用内存 继续,直到所有的内存都被使用。一切都好。但这里有一些问题:

一,。 有时我觉得程序用硬盘代替RAM, 因为速度变慢了,但内存仍然可用。 可能吗?如果是,当RAM仍然可用时,如何防止程序使用光盘? 或者一些临时文件被写入光盘

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

如果我在64位机器上用64位 不幸的是,什么是不可能的, 我的猜测是,在有4GRam的机器上,64位程序的可用RAM空间会更少 超过32位的程序,启用了图像\u文件\u大\u地址\u感知, 因为指针是64位的,所以它们本身就比32位指针占用更多的空间。 我的想法完全错了吗


感谢您的回复。

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


即使在64位Windows上,32位程序也不能使用超过4 GB的内存,最后,本机64位程序不会比32位程序使用更多的内存,因为在x64 Windows中,32位指针是64位指针


还有一个附带说明:如果您设置了大型地址感知开关,您应该确保您的应用程序(包括vcl、delphi单元和组件)能够处理>2GB的地址。例如,将指针强制转换为整数是不允许的。当然还有更多的陷阱。

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

感谢您提供准确且非常有用的答案。至少据我所知,我没有做奇怪的事情。当然不能将指针指向整数,请你再指向一些这样的禁止操作。因此,我可以检查使用大地址感知是否不会导致任何问题。我想您需要注意任何指针操作,尤其是指针数学,因为指向内存>2GB的指针在作为整数指针处理时是负数。有时,对象或Vcl组件的标记或数据字段是一个整数,用于存储指针。在Windows Messages Post/SendMessage中发送指针时,还使用一个整数作为lParam和wParam。可能还有很多事情需要注意…在x64 windows中,内部32位指针是64位指针吗?32位应用程序仍将在其虚拟地址空间中使用32位长指针—Windows将它们转换为64位物理地址,因为DOS使用20位物理地址,PAE在32位机器上使用36位物理地址。64位应用程序使用映射到64位物理地址的64位长虚拟地址。64位应用程序使用更多内存来存储其指针和其他数据类型。@ldsandon:我的意思是,就windows而言,有一个32位指针。在32位应用程序中,指针类型当然是4字节,而不是8字节,但我认为如果不使用数百万个变量,那么变量的额外内存并不重要。这取决于应用程序的类型。数据结构相对较小的代码密集型系统不会看到更大的内存使用量,而使用基于指针的大型结构的数据密集型系统会看到内存使用量,特别是当指针/数据大小比接近1时。例如,每个TList的内存使用量将增加一倍。这对于大多数应用程序来说是正确的,它几乎不会引起注意,但64位应用程序
离子使用的内存比32位的多。有些指令可能还需要更少的字节/操作码,因为x64只有一个调用约定和更多的寄存器。根据程序的性质,您可以非常接近Lazarus。