为什么“任何 CPU(首选 32 位)”允许我在 .NET 86 下分配比 x4.5 更多的内存

本文关键字:分配 x4 内存 NET CPU 任何 首选 允许我 为什么 | 更新日期: 2023-09-27 18:32:23

根据许多 SO 答案和这篇被广泛引用的博客文章,为"任何 CPU"构建的 .NET 4.5 应用程序选择了"首选 32 位"选项,将在 32 位和 64 位系统上作为 32 位进程运行(与 .NET 4.0 及更早版本不同)。换句话说,选择"首选 32 位"的 x86 和 AnyCPU 是等效的(忽略它是否可以在 ARM 上运行)。

但是,我的测试表明,在 64 位系统上,"AnyCPU 首选 32 位"应用程序(我确认运行 32 位)可以分配比 x86 应用程序更多的内存。我编写了一个 .NET 4.5 C# 控制台应用程序,该应用程序在循环中分配 10MB 字节数组(当然保留引用),直到它遇到 OutOfMemoryException,并在具有大量 RAM 的 64 位系统上运行它。当构建为 x86 时,它会在分配的大约 1.2GB 时下降。与"任何CPU(首选32位)"构建的代码相同,最高可达1.5GB。

为什么会有差异?

为什么“任何 CPU(首选 32 位)”允许我在 .NET 86 下分配比 x4.5 更多的内存

> 事实证明,在Visual Studio 2015中,构建为"AnyCPU(首选32位)"设置可执行文件上的IMAGE_FILE_LARGE_ADDRESS_AWARE位(相当于在其上运行editbin /LARGEADDRESSAWARE),而对于x86构建则不然。这可以通过dumpbin /HEADERS并查找"应用程序可以处理大型(>2GB)地址"行来确认。

Visual Studio 2013 的情况并非如此。 这一变化显然没有记录在案。

从理论上讲,这应该给 CLR 一个额外的 2GB 来玩。我不知道为什么可分配内存只增加了大约 300MB。