在c++中创建一个1000000000大小的数组时出现了以下错误.请帮我理解并解决它

Creating an array of size 1000000000 in c++ gave me the following error. Please help me understand and solve it

本文关键字:错误 解决 创建 c++ 一个 数组 1000000000      更新时间:2023-10-16

我需要创建一个1000000000大小的数组。

#include<iostream>
#include<cstdlib>
#include<math.h>
#include<cmath>
using namespace std;
unsigned long long int arr[1000000000];
int ZofF(long long int n)
{
for(unsigned long long int i=1;i<=1000000000;i++)
{
}
}
int main()
{
return 0;
}

我得到这样一个错误:

C:\Users\TARUNM~1\AppData\Local\Temp\ccccgeKSu.s汇编程序消息:63 C:\Users\TARUNM~1\AppData\Local\Temp\cccgeKSu.s错误:0000000 1dcd6504e的值对于000000000000004e处的4字节字段太大87 C:\Users\TARUNM~1\AppData\Local\Temp\cccgeKSu.s错误:0000000 1dcd6507e的值对于000000000000007e 的4字节字段太大


有一个解决方案:如何在C++中处理大小为1000000000的数组?

我曾试图将其划分为多个数组,但实际上我并没有从上面的链接中理解解决方案。这是代码:

#include<iostream>
#include<cstdlib>
#include<math.h>
#include<cmath>
using namespace std;
unsigned long int arr[125000000];
unsigned long int ar2[125000000];
unsigned long int ar3[125000000];
unsigned long int ar4[125000000];
unsigned long int ar5[125000000];
unsigned long int ar6[125000000];
unsigned long int ar7[125000000];
unsigned long int ar8[125000000];
int ZofF(long long int n)
{
for(unsigned long long int i=1;i<=250000000;i++)
{
}
}
int main()
{
return 0;
}

但此代码给了我以下错误。

c:\program files(x86)\dev cpp\mingw64\x86_64-w64-mingw32\lib\crt2.o在函数check_managed_app': 357 h:crossdevsrcmingw-w64-v3-svnmingw-w64-crtcrtcrtexe.c (.text+0x21): relocation truncated to fit: R_X86_64_PC32 against symbolmingw_initltsdrot_force'中

在C:\Program Files(x86)\Dev Cpp\MinGW64\x86_64-w64-mingw32\lib/libmingw32.a(lib64_libming32_a-tlssup.o)的.bss部分中定义358
h:\crossdev\src\mingw-w64-v3-svn\mingw-w64-crt\crtxe.c(.text+0x2b):根据符号`mingw_initsdyn_force'截断重新定位以适应:R_X86_64_PC32

在C:\Program Files(x86)\Dev Cpp\MinGW64\x86_64-w64-mingw32\lib/libmingw32.a(lib64_libming32_a-tlssup.o)的.bss部分中定义359
h:\crossdev\src\mingw-w64-v3-svn\mingw-w64-crt\crtxe.c(.text+0x35):根据符号`mingw_initltssuo-force'截断重新定位以适应:R_X86_64_PC32

在C:\Program Files(x86)\Dev Cpp\MinGW64\x86_64-w64-mingw32\lib/libmingw32.a(lib64_libming32_a-tlssup.o)的.bss部分中定义360
h:\crossdev\src\mingw-w64-v3-svn\mingw-w64-crte\crtex.c(.text+0x3f):根据中定义的符号"mingw_initcharmax"截断重新定位以适应:R_X86_64_PC32

C:\Program Files(x86)\Dev Cpp\MinGW64\x86_64-w64-mingw32\lib/libmingw32.a(lib64_libming32_a-charmax.o)中的.bss部分c: \program files(x86)\dev cpp\mingw64\x86_64-w64-mingw32\lib\crt2.o在中定义的函数pre_c_init': 129
h:crossdevsrcmingw-w64-v3-svnmingw-w64-crtcrtcrtexe.c (.text+0x51): relocation truncated to fit: R_X86_64_PC32 against symbol
mingw_app_type中

C:\Program Files(x86)\Dev Cpp\MinGW64\x86_64-w64-mingw32\lib/libmingw32.a中的.bss部分(lib64_libming32_a-ming_helpers.o)135
h:\crossdev\src\mingw-w64-v3-svn\mingw-w64-crte\crtex.c(.text+0x71):根据.bss 中定义的符号"_fmode"截断重新定位以适应:R_X86_64_PC32

C:\Program Files(x86)\Dev Cpp\MinGW64\x86_64-w64-mingw32\lib/libmingw32.a(lib64_libming32_a-xtxtmode.o)中的部分133
h:\crossdev\src\mingw-w64-v3-svn\mingw-w64-crte\crtex.c(.text+0x78):根据COMMON 中定义的符号"__onexitend"截断重新定位

C:\Program Files(x86)\Dev Cpp\MinGW64\x86_64-w64-mingw32\lib/libmingw32.a(lib64_libming32_a-atonexit.o)中的部分133
h:\crossdev\src\mingw-w64-v3-svn\mingw-w64-crte\crtex.c(.text+0x7f):根据中定义的符号"__onexitbbegin"截断重新定位以适应:R_X86_64_PC32

C:\Program Files(x86)\Dev Cpp\MinGW64\x86_64-w64-mingw32\lib/libmingw32.a(lib64_libming32_a-atonexit.o)中的COMMON部分135
h:\crossdev\src\mingw-w64-v3-svn\mingw-w64-crt\crtex.c(.text+0x86):根据中定义的符号"__imp__fmode"截断重新定位以适应:R_X86_64_PC32

C:\Program Files(x86)\Dev Cpp\MinGW64\x86_64-w64-mingw32\lib/libmsvcrt.a中的.didata$5节(dqows00253.o)c: \program files(x86)\dev cpp\mingw64\x86_64-w64-mingw32\lib\crt2.o在.bss 中定义的函数pre_cpp_init': 157
h:crossdevsrcmingw-w64-v3-svnmingw-w64-crtcrtcrtexe.c (.text+0x136): relocation truncated to fit: R_X86_64_PC32 against symbol
_newmode中

C:\Program Files(x86)\Dev Cpp\MinGW64\x86_64-w64-mingw32\lib/libmingw32.a(lib64_libming32_a-newmode.o)中的部分162
h:\crossdev\src\mingw-w64-v3-svn\mingw-w64-crt\crt\crtexe.c(.text+0x13d):输出中省略了额外的重新定位溢出〔错误〕ld返回1退出状态

请帮助我理解为什么会发生这种情况,以及如何创建1000000000大小的数组。我使用的是64位Windows8.1,i5内核,4GbRAM。我必须升级我的硬件吗?

为什么需要创建一个1000000000大小的数组?你想在这里解决什么问题?根据您试图存储的数据类型,std::vector可能是更好的选择。再说一遍,这真的取决于你想在这里解决什么样的问题。

long long int的大小至少为64位。1000000000*64大约是8 Gb,它比您的RAM大。这将是你的物理内存限制。

另一个限制是系统中设置的std::size_t的最大大小。你可以通过以下方式找到它:

#include <iostream>
#include <limits>
int main () {
std::cout << std::numeric_limits<size_t>::max()<<std::endl;
return 0;
}

但是,正如安德鲁所说,解决这样的问题从来都不是一种常见的方法。我建议您升级代码而不是硬件:)

您的问题不太清楚何时报告错误,但在我看来,这是在编译或链接期间,而不是运行时。

如果为true,那么这与硬件无关,而是编译器/链接器/加载程序的限制。

您可以查看文档以确定是否有允许更大阵列的选项。

然而,根据其他链接的答案,您几乎肯定应该在这里使用动态内存分配,而不是静态定义的数组。

执行此操作时,请确保检查是否存在分配失败。

const size_t numElements = 1000000000;
unsigned long long* arrayData = new unsigned long long[numElements];
if (arrayData == nullptr)
{
// Problem.
}
else
{
// All good.
// Use it.
// Clean up using array delete.
delete[] arrayData;
}

现在,您可能仍然需要将总大小保持在4GB以下,因此可以根据其他代码将数据块划分为多个底层阵列。

如果您执行所有这些操作,由于运行时系统内存不足,您仍然会遇到问题。

你可以购买更多的RAM(你需要8GB的RAM,系统的其他部分也需要更多的RAM),也可以重新思考你的方法,把问题分成几个小部分。