我们需要将其中一个可执行文件与此标志链接,因为它使用大量内存.
但为什么要给一个EXE文件特殊处理.为什么不标准化/ LARGEADDRESSAWARE?
所以问题是:即使你不需要它,使用/ LARGEADDRESSAWARE也有什么问题.为什么不将它用作所有EXE文件的标准?
Windows x64位,带5GB RAM.我的二进制文件是64位版本,使用版本编译器构建 - "Microsoft(R)C/C++优化编译器版本14.00.50727.762 for x64"
Microsoft建议设置以下注册表项以测试64位应用程序,并在我的框中设置相同.如果我没有设置以下注册表,则不会发生此问题,因为程序位于低地址.讨论中提到了相同的注册表项 - 作为程序员,在迁移到64位窗口时需要担心什么?
要强制分配在较低地址之前从较高地址分配以进行测试,请在调用VirtualAlloc时指定MEM_TOP_DOWN或将以下注册表值设置为0x100000:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\AllocationPreference
char *alloc_str()
{
char *temp;
temp = (char *) malloc(60);
/* copy some data to temp */
return temp;
}
main()
{
char *str;
str = (char *)alloc_str();
}
Run Code Online (Sandbox Code Playgroud)
malloc返回0x000007fffe999b40存储的地址,temp但当指针返回时main(),str只获取后半部分 - 0xfffffffffe999b40我无法访问该位置的数据.
致力于将32位Windows C++应用程序移植到64位.不幸的是,代码在DWORD和指针值之间的两个方向上使用频繁的转换.
其中一个想法是在进程启动期间尽早保留前4GB的虚拟进程空间,以便所有后续的保留内存调用都来自大于4 GB的虚拟地址.这将导致访问冲突错误从指向DWORD的任何不安全的强制转换,然后返回指针,将有助于提前捕获错误.
当我查看一个非常简单的单行C++程序的内存映射时,底部4GB内有很多库加载?有没有办法确保所有库等只加载4GB以上?
谢谢
我有一段代码使用Delphi XE3编译成64位COM DLL.
function TRPMFileReadStream.Read(var Buffer; const Count: Longint): Longint;
begin
if ((Self.FPosition >= 0) and (Count > 0)) then
begin
Result := Self.FSize - Self.FPosition;
if ((Result > 0) and (Result >= Count)) then
begin
if (Result > Count) then
begin
Result := Count;
end;
CopyMemory(
Pointer(@Buffer),
Pointer(LongWord(Self.FMemory) + Self.FPosition),
Result
);
Inc(Self.FPosition, Result);
Exit;
end;
end;
Result := 0;
end;
Run Code Online (Sandbox Code Playgroud)
在Win7-64bit上,以上工作正常.但在Win8-64bit上,相同的DLL文件将在CopyMemory上抛出Access Violation.CopyMemory在WinAPI.windows单元中实现.
就是这样.
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: NativeUInt);
begin
Move(Source^, Destination^, Length);
end;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?谢谢.
我从其他帖子中了解到,"IMAGE_FILE_LARGE_ADDRESS_AWARE"可能会有效地扩展内存可用性,例如Delphi 2007.
我不认为这在Delphi6中工作,确实是这样,还是应该有效?或者是否有另一个命令执行相同的操作?
如果没有,我可能需要迁移到更高版本的Delphi.然后,有没有人知道最新版本的Delphi是什么,这将很容易让我迁移我现有的代码(理想情况下,我现有的代码,这是相当简单的Turbo Pascal类型代码,将按原样工作)并将支持"IMAGE_FILE_LARGE_ADDRESS_AWARE"'技巧'扩展内存?
非常感谢!
REMCO