在c ++中创建一个大小为1000000000的数组给了我以下错误。请帮助我理解并解决它

时间:2015-04-20 01:16:44

标签: c++ arrays gcc compiler-errors out-of-memory

我需要创建一个大小为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
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
mingw_app_type'中      C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-mingw_helpers.o)中的

.bss部分   135个
  h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c(。text + 0x71):重定位被截断以适合:R_X86_64_PC32对.bss中定义的符号`_fmode'

     C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-xtxtmode.o)中的

部分   133个
  h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c(。text + 0x78):重定位被截断以适合:R_X86_64_PC32对着COMMON中定义的符号`__onexitend'

     C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-atonexit.o)中的

部分   133个
  h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c(。text + 0x7f):重定位被截断以适合:R_X86_64_PC32对照

中定义的符号`__onexitbegin'      

C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-atonexit.o)中的COMMON部分   135个
  h:\ crossdev \ src \ mingw-w64-v3-svn \ mingw-w64-crt \ crt \ crtexe.c(。text + 0x86):重定位被截断以适合:R_X86_64_PC32对抗

中定义的符号`__imp__fmode'      在C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmsvcrt.a(dqows00253.o)中

.idata $ 5部分   c:\ program files(x86)\ dev-cpp \ mingw64 \ x86_64-w64-mingw32 \ lib \ crt2.o在.bss中定义的函数pre_cpp_init': 157
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
_ newmode'

     C:\ Program Files(x86)\ Dev-Cpp \ MinGW64 \ x86_64-w64-mingw32 \ lib / libmingw32.a(lib64_libmingw32_a-_newmode.o)中的

部分   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。我是否必须升级我的硬件?

3 个答案:

答案 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以及更多其他系统内容),或重新考虑您的方法,将问题分成小块。