用c ++制作一个大的二维数组

时间:2017-05-09 02:46:25

标签: c++ arrays memory

我有以下代码:

#include <bits/stdc++.h>
using namespace std;

const int MAX=25;
const int TMAX=1 << MAX - 1;
double D[TMAX][MAX];

int main(){}

如果我编译它,我得

champ@champ-S451LN:~/code$ g++   kike2.cpp 
/tmp/ccuK5NOq.o: In function `__static_initialization_and_destruction_0(int, int)':
kike2.cpp:(.text+0x717): relocation truncated to fit: R_X86_64_PC32 against `.bss'
kike2.cpp:(.text+0x72a): relocation truncated to fit: R_X86_64_PC32 against `.bss'
collect2: error: ld returned 1 exit status

如果我使MAX = 22我没有得到这个错误,我认为问题是TMAX * MAX超过2 ^ 32。

访问这么大的2D数组对我有用。有谁知道如何制作它们?

这是我最后所做的:

#include <bits/stdc++.h>
using namespace std;

double** D = new double*[TMAX];// this is the DP array (its big so we save it differently)

int main(){
    for(int i = 0; i < TMAX; ++i){// store the big array
        D[i] = new double[MAX];
    }
}

2 个答案:

答案 0 :(得分:3)

你不能让它们在堆栈上真的很大,因为堆栈几乎总是比主要的meory更加有限。

使用mallocnew来创建堆上的对象;主内存将是唯一的限制,包括使用交换文件,如果你想继续使用。

答案 1 :(得分:1)

您必须在堆中使用它,而不是堆栈。

  template<typename _ForwardIterator, typename _Size, typename _Tp,
           typename _Allocator>
    _ForwardIterator
    __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n, 
                             const _Tp& __x, _Allocator& __alloc)
    {
      _ForwardIterator __cur = __first;
      __try
        {
          typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
          for (; __n > 0; --__n, ++__cur)
            __traits::construct(__alloc, std::__addressof(*__cur), __x);
          return __cur;
        }
      __catch(...)
        {
          std::_Destroy(__first, __cur, __alloc);
          __throw_exception_again;
        }
    }

  template<typename _ForwardIterator, typename _Size, typename _Tp,
           typename _Tp2>
    inline _ForwardIterator
    __uninitialized_fill_n_a(_ForwardIterator __first, _Size __n, 
                             const _Tp& __x, allocator<_Tp2>&)
    { return std::uninitialized_fill_n(__first, __n, __x); }