c++ - 在 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 位访问权限?
解决方案
让我首先正确回答这个问题,以便其他人可以轻松获得信息。这三个动作都是必要的。单靠一两个都行不通。
- 将项目类型从“Win32 控制台”更改为“C++/CLR 控制台”</li>
- 按照WhozCraig的指示更改数组定义
- 更改项目属性,链接器 | 系统 | EnableLargeAddresses是 (/LARGEADDRESSAWARE)
现在让我们提一些评论:
“为 x64 架构而不是 x32 编译程序”**
我明确表示它是作为 x64 版本编译的,并且 Win32 方面可能会胜出。
如果在堆栈上分配,它将不起作用。
它作为全局变量在堆上分配,但我也说过我尝试分配它new
也会分配给堆。
你的机器有多少内存?
真的。我的8GB RAM 对于应用程序来说有点弱,但不会给出编译器错误,并且足以运行分配给它的 4GB 的程序。
可能重复…</p>
不,有一些非常古老的问题不是很相关。
内存映射文件(Thomas Matthews)
一个非常好的主意。谢谢你。
至于对这个问题的 6 票否决,说真的。大多数评论者甚至似乎都没有理解这个问题,更不用说解决方案了。/LARGEADDRESSAWARE
无论开关和 x64 编译如何,标准 C 数组似乎都由带符号整数(32 位)索引。
再次感谢WhozCraig和Thomas 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根据任务管理器分配给进程。
推荐阅读
- java - 为什么函数式样式搜索在 Java 中执行得更快,然后是命令式
- python-3.x - 在远程服务器上执行 tensorflow python3,子进程无法解释所有 tensorflow 输入 args。ImportError:没有名为“脚本”的模块
- jquery - 在 Yoast 站点地图上是否有使 jQuery 出列的过滤器或操作?
- angular - 如何在角度 6 中调用数组中的数据
- sql - 加入四张表结果正确加入第五张表后出现重复和错误结果
- python - 使用 pip3 在 Windows 10 设备上安装 Jupyter 时出错 - 正在安装 Jupyter 1.0.0,但未运行
- python - 将html字符串拆分为列表
- javascript - 在 reactjs 中更新嵌套状态
- css - 需要消除我网站上的“添加菜单”文本
- email - Mailchimp DATE Merge Tag in URL updating after email sent