首页 > 解决方案 > 在 C(或 C++)中分配大于 2GB 的数组

问题描述

我正在运行 Windows 10 64 位。我的编译器是 Visual Studio 2015。

我想要的是:

unsigned char prime[UINT_MAX];

(和更大的数组)。该示例给出编译器错误 C2148,因为该应用程序是“Win32 控制台应用程序”。同样,我不能使用new创建数组;同样的问题。我将它构建为“x64 版本”,但我猜 WIN32 控制台部分正在获胜!

我想释放我的 64 位操作系统的力量,摆脱对数组索引的烦人 INT_MAX 限制,即正确的 64 位操作。我的应用程序是一个简单的 C/C++ 东西,除了命令行界面之外,它既不需要也不想要任何东西。

我确实安装了(免费)Visual Studio 2017 应用程序,但它没有给我我喜欢的简单控制台应用程序(所以我卸载了它)。

我是否可以在 Visual Studio 中构建其他一些应用程序类型来访问超过 4GB 的内存?是否有其他(免费)编译器可用于在 Windows 下获得完整的 64 位访问权限?

标签: c++arrays64-bitlarge-data

解决方案


让我首先正确回答这个问题,以便其他人可以轻松获得信息。这三个动作都是必要的。单靠一两个都行不通。

  1. 将项目类型从“Win32 控制台”更改为“C++/CLR 控制台”</li>
  2. 按照WhozCraig的指示更改数组定义
  3. 更改项目属性,链接器 | 系统 | EnableLargeAddresses是 (/LARGEADDRESSAWARE)

现在让我们提一些评论:

“为 x64 架构而不是 x32 编译程序”**

我明确表示它是作为 x64 版本编译的,并且 Win32 方面可能会胜出。

如果在堆栈上分配,它将不起作用。

它作为全局变量在堆上分配,但我也说过我尝试分配它new也会分配给堆。

你的机器有多少内存?

真的。我的8GB RAM 对于应用程序来说有点弱,但不会给出编译器错误,并且足以运行分配给它的 4GB 的程序。

可能重复…</p>

不,有一些非常古老的问题不是很相关。

内存映射文件(Thomas Matthews)

一个非常好的主意。谢谢你。

至于对这个问题的 6 票否决,说真的。大多数评论者甚至似乎都没有理解这个问题,更不用说解决方案了。/LARGEADDRESSAWARE无论开关和 x64 编译如何,标准 C 数组似乎都由带符号整数(32 位)索引。

再次感谢WhozCraigThomas Matthews帮助我解决了这个问题。

#include <vector>
typedef unsigned long long U64;
const U64 MAX_SIZE = 3*((U64)INT_MAX);
std::vector<unsigned char>prime(MAX_SIZE);
// The prime vector is then accessed in the usual way, prime[bigAddress]

我还在项目设置中关闭了 Unicode 支持,因为这可能会使字符长 2 个字节。

该程序现在在具有32GB ECC RAM 的 Xeon 工作站上运行。

6GB根据任务管理器分配给进程。


推荐阅读