我有以下代码:
#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];
}
}
答案 0 :(得分:3)
你不能让它们在堆栈上真的很大,因为堆栈几乎总是比主要的meory更加有限。
使用malloc
或new
来创建堆上的对象;主内存将是唯一的限制,包括使用交换文件,如果你想继续使用。
答案 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); }