在C(或C ++)中分配大于2GB的数组

时间:2018-09-20 14:44:09

标签: c++ arrays 64-bit large-data

我正在运行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位访问权限吗?

1 个答案:

答案 0 :(得分:0)

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

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

现在让我们提一些评论:

“为x64体系结构而不是x32编译程序” ** 我明确声明它已被编译为x64版本,并且Win32方面可能会胜出。

如果分配在堆栈上,它将不起作用。 ** 它是作为全局变量在堆上分配的,但是我也说过,我尝试使用 new 分配它,它也会分配给堆。

您的计算机有多少内存? ** 真。我的 8GB RAM对于应用程序来说有点弱,但不会出现编译器错误,足以运行分配了4GB内存的程序。

…**的可能重复项 不,有一些非常老的问题并不十分相关。

内存映射文件(Thomas Matthews) 一个很好的主意。谢谢。

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

再次感谢 WhozCraig 托马斯·马修斯,帮助我解决了问题。

#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支持,因为这可能会使chars长2个字节。

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

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