使用IMAGE_FILE_LARGE_ADDRESS_AWARE标志在Delphi中可能导致哪些潜在副作用?
- 内容介绍
- 文章标签
- 相关推荐
本文共计589个文字,预计阅读时间需要3分钟。
在Delphi 7中使用带有FastMM4的程序,若要确保不使用内置内存管理器并支持超过2GB的内容,可以采用以下方法:
1. 禁用内置内存管理器:在程序启动时,通过设置全局变量禁用Delphi的内置内存管理器。
delphi{$R-} // 禁用Delphi的内置内存管理器
uses ..., FastMM4;
var OldMM: TMemoryManager;
begin OldMM :=TMemoryManager.Create; // 保存旧的内存管理器 try // 你的代码逻辑 finally OldMM.Free; // 释放旧的内存管理器 end;end;
2. 使用FastMM4:确保FastMM4正确配置以支持大内存。FastMM4是一个内存管理库,可以优化内存分配和释放,支持超过2GB的内存。
delphiuses ..., FastMM4;
var OldMM: TMemoryManager;
begin OldMM :=TMemoryManager.Create; // 保存旧的内存管理器 try // 启用FastMM4 FastMM4.Init(true, true); // 启用内存池和内存映射文件
// 你的代码逻辑
finally FastMM4.Done; // 关闭FastMM4 OldMM.Free; // 释放旧的内存管理器 end;end;
3. 使用IMAGE_FILE_LARGE_ADDRESS_AWARE标志:确保你的程序链接器设置包含`IMAGE_FILE_LARGE_ADDRESS_AWARE`标志,这样程序就可以使用超过2GB的虚拟地址空间。
delphiuses ..., Windows;
var OldMM: TMemoryManager;
begin OldMM :=TMemoryManager.Create; // 保存旧的内存管理器 try // 启用FastMM4 FastMM4.Init(true, true); // 启用内存池和内存映射文件
// 设置程序标志 SetProcessAffinityMask(GetCurrentProcess, 0); // 设置CPU亲和性 SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF); // 设置工作集大小
// 你的代码逻辑
finally FastMM4.Done; // 关闭FastMM4 OldMM.Free; // 释放旧的内存管理器 end;end;
通过上述步骤,你可以确保在Delphi 7中使用FastMM4和超过2GB的内存时,程序能够有效地管理内存并避免使用内置的内存管理器。
在我的程序中使用IMAGE_FILE_LARGE_ADDRESS_AWARE标志(使用超过2GB的RAM)有什么副作用?我正在使用带有FastMM4的Delphi 7.
您需要确保不使用内置内存管理器并使用可支持地址> 2GB的内容.例如FastMM.您的代码库中可能还有其他代码(通常是第三方代码),这些代码将违反地址> 2GB.我个人通过在64位Windows下运行并强制系统使用top-down memory allocation via a registry setting来解决这个问题.
执行此操作时,您可能会遇到Windows中的一些错误.例如,当其参数的地址> 2GB时,Vista上的GetCursorPos失败.我通过使用经过GetCursorInfo的版本修补Windows.GetCursorPos来解决这个问题.这个错误在Windows 7中得到修复,但MS选择不将其反向移植到Vista.
我不能强调在启用自上而下的内存分配的情况下运行的重要性.
本文共计589个文字,预计阅读时间需要3分钟。
在Delphi 7中使用带有FastMM4的程序,若要确保不使用内置内存管理器并支持超过2GB的内容,可以采用以下方法:
1. 禁用内置内存管理器:在程序启动时,通过设置全局变量禁用Delphi的内置内存管理器。
delphi{$R-} // 禁用Delphi的内置内存管理器
uses ..., FastMM4;
var OldMM: TMemoryManager;
begin OldMM :=TMemoryManager.Create; // 保存旧的内存管理器 try // 你的代码逻辑 finally OldMM.Free; // 释放旧的内存管理器 end;end;
2. 使用FastMM4:确保FastMM4正确配置以支持大内存。FastMM4是一个内存管理库,可以优化内存分配和释放,支持超过2GB的内存。
delphiuses ..., FastMM4;
var OldMM: TMemoryManager;
begin OldMM :=TMemoryManager.Create; // 保存旧的内存管理器 try // 启用FastMM4 FastMM4.Init(true, true); // 启用内存池和内存映射文件
// 你的代码逻辑
finally FastMM4.Done; // 关闭FastMM4 OldMM.Free; // 释放旧的内存管理器 end;end;
3. 使用IMAGE_FILE_LARGE_ADDRESS_AWARE标志:确保你的程序链接器设置包含`IMAGE_FILE_LARGE_ADDRESS_AWARE`标志,这样程序就可以使用超过2GB的虚拟地址空间。
delphiuses ..., Windows;
var OldMM: TMemoryManager;
begin OldMM :=TMemoryManager.Create; // 保存旧的内存管理器 try // 启用FastMM4 FastMM4.Init(true, true); // 启用内存池和内存映射文件
// 设置程序标志 SetProcessAffinityMask(GetCurrentProcess, 0); // 设置CPU亲和性 SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF); // 设置工作集大小
// 你的代码逻辑
finally FastMM4.Done; // 关闭FastMM4 OldMM.Free; // 释放旧的内存管理器 end;end;
通过上述步骤,你可以确保在Delphi 7中使用FastMM4和超过2GB的内存时,程序能够有效地管理内存并避免使用内置的内存管理器。
在我的程序中使用IMAGE_FILE_LARGE_ADDRESS_AWARE标志(使用超过2GB的RAM)有什么副作用?我正在使用带有FastMM4的Delphi 7.
您需要确保不使用内置内存管理器并使用可支持地址> 2GB的内容.例如FastMM.您的代码库中可能还有其他代码(通常是第三方代码),这些代码将违反地址> 2GB.我个人通过在64位Windows下运行并强制系统使用top-down memory allocation via a registry setting来解决这个问题.
执行此操作时,您可能会遇到Windows中的一些错误.例如,当其参数的地址> 2GB时,Vista上的GetCursorPos失败.我通过使用经过GetCursorInfo的版本修补Windows.GetCursorPos来解决这个问题.这个错误在Windows 7中得到修复,但MS选择不将其反向移植到Vista.
我不能强调在启用自上而下的内存分配的情况下运行的重要性.

