10

我正在检查我可以在 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);

我有链接器-> 高级-> 目标机是 Machinex64。另外 Linker->System->Enable Large Addresses 为 Yes (不确定这是否真的重要)。pc中的分页文件\物理内存在这里重要吗?(我确定它是一个 64 位应用程序,因为如果我删除该行并且只有 char* cp; 它是 8 字节。)我是否缺少一些设置?

4

2 回答 2

7

这似乎是 x64 目标的 32 位交叉编译器中的一个缺陷。icabod 在上述评论中发布的Microsoft Connect 链接解决了这个特定问题。不幸的是,该错误的状态已设置为Closed - Won't Fix

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

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

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

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

可以应用以下解决方法:

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

于 2013-11-08T21:22:14.517 回答
1

编译器可能会尝试优化,因为您的 ARRSIZE 值是一个常量。然后它达到了自己的静态初始化限制。您可能只需取出“const”关键字即可。

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

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;
}
于 2013-11-07T06:58:48.747 回答