数组大小错误 x64 进程

Array size error x64 process

本文关键字:x64 进程 错误 数组      更新时间:2023-10-16

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

我有链接器>高级>目标计算机是机器x64。还链接>系统>启用大地址为是(不确定这是否真的重要)。电脑中的分页文件\物理内存在这里重要吗?(我确定它是一个 64 位应用程序,因为如果我删除该行并且只有 char* cp;它是 8 字节。我是否缺少某些设置?

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

以下代码段将无法使用 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。不幸的是,Visual Studio即使在64位版本的Windows上运行时也会启动32位编译器,目标是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 中仍然存在,并且所有解决方法仍然适用。

编译器可能正在尝试优化,因为您的 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;
}