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/46423970/

相关文章:

c++ - 如何检查回文列表

c++ - 在 C++ 应用程序 : gethostbyname() failing 中检查互联网连接的可靠方法

Java 泛型和数组类型

c# - 包含数组的 JSON 上的 JavaScriptSerializer

javascript - 将数组部分映射到新数组

c# - 在 VS2010 中打开 .mdproj 文件

c++ - 来自编程珍珠的 bsort 示例

c++ - 自定义键盘快捷方式在 Visual Studio 中不起作用

c# - C# 中英寸、英尺和码的距离转换器

vb.net - msstdfmt.dll 1.0.0 缺失错误