我需要创建一个大小为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 \ cccgeKSu.s汇编程序消息: 63 C:\ Users \ TARUNM~1 \ AppData \ Local \ Temp \ cccgeKSu.s错误:00000001dcd6504e的值对于000000000000004e处的4字节字段而言太大 87 C:\ Users \ TARUNM~1 \ AppData \ Local \ Temp \ cccgeKSu.s错误:00000001dcd6507e的值对于000000000000007e的4字节字段而言太大
有一个解决方案: How to handle an array with size 1,000,000,000 in C++?
我试图把它分成多个数组,我实际上并没有从上面的链接中理解解决方案。 这是代码:
#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:\crossdev\src\mingw-w64-v3-svn\mingw-w64-crt\crt\crtexe.c (.text+0x21): relocation truncated to fit: R_X86_64_PC32 against symbol
mingw_initltsdrot_force'在C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-tlssup.o)中的.bss部分中定义 358个
h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c(。text + 0x2b):重定位被截断以适合:R_X86_64_PC32对象符号`mingw_initltsdyn_force'在C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-tlssup.o)中的.bss部分中定义 359个
h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c(。text + 0x35):重定位被截断以适合:R_X86_64_PC32对象符号`mingw_initltssuo_force'在C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-tlssup.o)中的.bss部分中定义 360个
h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c(。text + 0x3f):重定位被截断以适合:R_X86_64_PC32对抗中定义的符号`mingw_initcharmax' C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-charmax.o)中的 .bss部分 c:\ program files(x86)\ dev-cpp \ mingw64 \ x86_64-w64-mingw32 \ lib \ crt2.o在
中定义的函数pre_c_init': 129
mingw_app_type'中 C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-mingw_helpers.o)中的
h:\crossdev\src\mingw-w64-v3-svn\mingw-w64-crt\crt\crtexe.c (.text+0x51): relocation truncated to fit: R_X86_64_PC32 against symbol.bss部分 135个
C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-xtxtmode.o)中的
h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c(。text + 0x71):重定位被截断以适合:R_X86_64_PC32对.bss中定义的符号`_fmode'部分 133个
C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-atonexit.o)中的
h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c(。text + 0x78):重定位被截断以适合:R_X86_64_PC32对着COMMON中定义的符号`__onexitend'部分 133个
中定义的符号`__onexitbegin'
h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c(。text + 0x7f):重定位被截断以适合:R_X86_64_PC32对照C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-atonexit.o)中的COMMON部分 135个
中定义的符号`__imp__fmode' 在C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmsvcrt.a(dqows00253.o)中
h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c(。text + 0x86):重定位被截断以适合:R_X86_64_PC32对抗.idata $ 5部分 c:\ program files(x86)\ dev-cpp \ mingw64 \ x86_64-w64-mingw32 \ lib \ crt2.o在.bss中定义的函数
C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-_newmode.o)中的pre_cpp_init': 157
_ newmode'
h:\crossdev\src\mingw-w64-v3-svn\mingw-w64-crt\crt\crtexe.c (.text+0x136): relocation truncated to fit: R_X86_64_PC32 against symbol部分 162个
h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c(。text + 0x13d):从输出中省略了额外的重定位溢出 [错误] ld返回1退出状态
请帮助我理解为什么会发生这种情况以及如何创建一个大小为1000000000的数组。我在i5内核上使用64位Windows 8.1和4Gb RAM。我是否必须升级我的硬件?
答案 0 :(得分:0)
为什么需要创建一个大小为1000000000的数组?你想在这里解决什么问题?也许std :: vector会是更好的选择,具体取决于您尝试存储的数据类型。同样,这实际上取决于你在这里要解决的问题。
答案 1 :(得分:0)
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;
}
但是,就像安德鲁所说,解决任何问题都不是常见的方法。我建议您升级代码而不是硬件:)
答案 2 :(得分: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以下,因此根据您的其他代码将其分成多个底层数组。
如果您执行了所有这些操作,则由于运行时缺少系统内存,您仍会遇到问题。
您可以购买更多内存(并且您需要8GB以及更多其他系统内容),或重新考虑您的方法,将问题分成小块。