c++ - 数组大小错误 x64 进程

标签 c++ arrays visual-studio-2010 winapi

我正在检查我可以在 X64 应用程序上创建多大的数组,我的理解是我可以在 X64 进程上创建大于 2^31 的数组,但是我在 VS2010 编译器上遇到编译错误,代码如下

const size_t ARRSIZE = size_t(1)<<32;
int main()
{
    char *cp = new char[ARRSIZE];
    return 0;
}

在目标 x64 平台上的 VS2010 上给出编译器错误“错误 C2148:数组的总大小不能超过 0x7fffffff 字节”,我最多可以创建 (size_t(1)<<32 - 1);

我有 Linker->Advanced->Target Machine is Machinex64。 Linker->System->Enable Large Addresses 也为 Yes(不确定这是否真的很重要)。 pc 中存在的分页文件\Physical Ram 在这里重要吗? (我确定它是一个 64 位应用程序,因为如果我删除该行并且只有 char* cp;它是 8 字节。) 我是否缺少某些设置?

最佳答案

这似乎是针对 x64 目标的 32 位交叉编译器中的一个缺陷。 Microsoft Connect link icabod 在上面的评论中发布解决了这个特定问题。不幸的是,错误的状态已设置为已关闭 - 不会修复

使用 x64 的 32 位交叉编译器将无法编译以下代码片段:

char* p = new char[(size_t)1 << 32];

const size_t sz = (size_t)1 << 32;
char* p = new char[sz];

当使用 x64 的 32 位交叉编译器编译时,以上两个都将失败并显示错误消息 error C2148: total size of array must not exceed 0x7fffffff bytes。不幸的是,即使在针对 x64 的 64 位版本的 Windows 上运行,Visual Studio 也会启动 32 位编译器。

可以应用以下解决方法:

  • 使用适用于 x64 的 native 64 位编译器从命令行编译代码。
  • 将代码更改为以下任一:

    size_t sz = (size_t)1 << 32;  // sz is non-const
    char* p = new char[sz];
    

    std::vector<char> v( (size_t)1 << 32 );
    

该错误在 Visual Studio 2012 中仍然存在,所有解决方法仍然适用。

关于c++ - 数组大小错误 x64 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19803162/

相关文章:

arrays - 如何将两个 Unicode 字符合并为一个

.net - 在 Visual Studio 2010 中使用 .Net 2.0 Web 引用

c++ - 当 vector 改变容量时有什么方法可以更新指针/引用值吗?

c++ - 如何或或异或和内存块

javascript - 从 Google 表格中提取数组键值以用作 Google map 上的标记

java - 读取 CSV 文件和 IF 语句值 0?

c# - 通过编程使用时,我的插入命令不会更改数据库

c++ - C# 与非托管 C++ 互操作性的续篇

c++ - 没有默认构造函数的对象数组初始化

c++ - 使用鼠标回调修改类中的 Mat 属性