Win32 编译器选项和内存分配

Win32 compiler option and memory allocation

我尝试编译了以下代码:

extern "C" {
    #include "netcdf.h"
}

int main() {
    const int Ntime = 336;
    const int Nlon = 1442;
    const int Nlat = 1021;
    double* dhsum_vals = new double[Ntime * Nlat * Nlon];
}

使用 32 位版本编译时,出现错误 C2148“数组的总大小不能超过 0x7fffffff 字节”。我认为,这里的问题是 32 位程序不允许使用我在这里想要的那么多内存。如果我使用 64 位版本编译,我会收到错误消息,即下载 32 位版本时找不到 netcdf。所以,我的解决方案是下载 64 位版本的 netcdf 库。然而,我的意图是,在采用 32 位版本时,它应该更兼容。除了使用 64 位版本的 netcdf 之外,我的问题还有其他解决方案吗?

在微软Windows上,32位进程的virtual address space被限制为2^32字节,也就是4GB左右。但是,较高的 2 GB 由系统保留,因此您实际上只有大约 2 GB 的地址 space.

此外,此地址 space 是碎片化的,因此您将无法在一个连续的块中分配 2 GB。如果您尝试几个较小的内存分配,您最多可以获得 2 GB。

虽然 32 位进程使用 Address Windowing Extensions API 可以使用超过 4 GB 的内存,但这需要特殊的安全权限并使您的代码不必要地复杂,因为您无法拥有所有内存您正在使用映射到您的虚拟地址 space 一次。因此,我强烈建议您在处理大量内存时编译 64 位版本的应用程序。

我认为使用 64 位不会降低您的程序的兼容性,因为几乎所有现代硬件和操作系统都支持它。