数组大小错误x64进程

时间:2013-11-06 02:48:34

标签: 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;
}

给编译器错误&#34;错误C2148:在目标x64平台上的VS2010上,阵列的总大小不得超过0x7fffffff字节&#34; ,我可以创建upto(size_t(1)&lt; &lt; 32 - 1);

我有Linker-&gt; Advanced-&gt; Target Machine是Machinex64。 Linker-&gt; System-&gt;启用大地址为是(不确定这是否真的重要)。 pc中存在的分页文件\物理Ram是否重要? (我确定它是一个64位的应用程序,因为如果我删除该行并且只有char * cp;它是8字节。) 我错过了一些设置吗?

2 个答案:

答案 0 :(得分:6)

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

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

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

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

当使用32位交叉编译器编译x64时,上述两种方法都将失败并显示错误消息error C2148: total size of array must not exceed 0x7fffffff bytes。不幸的是,Visual Studio确实启动了32位编译器,即使在64位版本的Windows上运行,目标是x64。

可以应用以下变通方法:

  • 从命令行使用x64的本机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中,并且所有解决方法仍然适用。

答案 1 :(得分:1)

编译器可能正在尝试优化,因为您的ARRSIZE值是常量。然后它会达到自己的静态初始化限制。你可能只需要取出&#34; const&#34;关键字,它会工作。

如果没有,这样的事情可能会奏效。

extern size_t GetArraySize();

int main()
{
    size_t allocationsize = GetArraySize();

    char *cp = new char[allocationsize];
    return 0;
}

size_t GetArraySize()
{
    // compile time assert to validate that size_t can hold a 64-bit value
    char compile_time_assert_64_bit[(sizeof(size_t) == 8)?1:-1];

    size_t allocsize = 0x100000000UL; // 64-bit literal

    return allocsize;
}