数组大小错误 x64 进程
Array size error x64 process
我正在检查我可以在 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;
}
- boost::进程间消息队列引发错误
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 是否可以通过C++扩展强制多个python进程共享同一内存
- IPC使用多个管道和分支进程来运行Python程序
- 异常属于C++中的线程还是进程
- WMI检测进程创建事件-c++
- 为x86而非x64编译时出错
- c++多进程编写一个唯一的文件
- 如何在C++中将函数发送到另一个进程
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- 在x64进程中调用x86 winapi函数
- 将x86代码注入x64进程
- x64 进程可以在 4GB RAM 上占用多少内存
- 数组大小错误 x64 进程
- Dll 注入器不适用于 x64 进程
- 从x64进程获取另一个进程的32位PEB
- 从x64进程获取函数表
- 查找位置(寻找c++初学者)以创建Windows Vista x64 Ultimate的挂起进程程序
- 从c#调用x64 c++ DLL,进程挂起(更新)
- x64处理器上的32位进程内存泄漏