在Stack上声明大数组

时间:2013-06-10 17:36:14

标签: c++ arrays memory stack allocation

我正在使用Dev C ++编写模拟程序。为此,我需要声明一个数据类型为double的单维数组。它包含4200000个元素 - 例如double n[4200000]

编译器没有显示错误,但程序在执行时退出。我已经检查过,程序对于具有5000元素的数组执行得很好。

现在,我知道不建议在堆栈上声明如此大的数组。但是,模拟需要我多次调用数组中的特定元素 - 例如,对于给定的计算,我可能需要n[234]n[46664]的值。因此,我需要一个数组,在其中更容易筛选元素。

有没有办法可以在堆栈上声明这个数组?

4 个答案:

答案 0 :(得分:9)

没有没有(我们会说#34;合理的")方法在堆栈上声明这个数组。但是,您可以在堆栈上声明指针,并在堆上留出一些内存。

double *n = new double[4200000];

访问n [234],应该不比访问你声明的数组的n [234]更快:

double n[500];

甚至更好,你可以使用矢量

std::vector<int> someElements(4200000);
someElements[234];//Is equally fast as our n[234] from other examples, if you optimize (-O3) and the difference on small programs is negligible if you don't(+5%)

如果使用-O3进行优化,则与数组一样快,并且更加安全。与

一样
double *n = new double[4200000]; 

解决方案除非你这样做否则会泄漏内存:

delete[] n;

除了例外和各种事情,这是一种非常不安全的做事方式。

答案 1 :(得分:7)

您可以增加堆栈大小。尝试将这些选项添加到链接标记中:

-Wl,--stack,36000000

虽然它可能太大了(我不确定Windows是否对堆栈大小设置了上限。)但实际上,即使它有效,也不应该这样做。使用动态内存分配,如其他答案所述。

(很奇怪,写一个答案,希望它不会被接受...... :-P)

答案 2 :(得分:3)

是的,你可以在堆栈上声明这个数组(有一点额外的工作),但这不明智。

没有正当理由说明阵列必须存在于堆栈中。

动态分配单个数组一次的开销是可以忽略的(你可以说“零”),如果你担心的话,智能指针可以安全地处理不泄漏的内存。
堆栈分配的内存与堆分配的内存没有任何不同(除了小对象的一些缓存效果,但这些不适用于此)。

就此而言,就是不要这样做。

如果你坚持你必须在堆栈上分配数组,你需要先保留32兆字节的堆栈空间(最好是多一点)。为此,使用Dev-C ++(假定Windows + MingW),您需要使用编译器标志(例如-Wl,--stack,34000000设置保留的可执行文件的堆栈大小(这保留稍微超过32MiB),或者创建一个线程(允许您为该线程指定保留的堆栈大小) 但实际上,再次,就是不要这样做。动态分配大型数组并没有错。

答案 3 :(得分:0)

你有没有理由特别想要这个?

我问,因为以下内容将为您提供一个可以类似方式使用的构造(尤其是使用array[index]访问值),但它的大小受限(总的最大大小取决于32位/ 64位内存型号和可用内存(RAM和交换内存)),因为它是从堆中分配的。

int arraysize= 4200000;
int *heaparray= new int[arraysize];

... 

k= heaparray[456];

...

delete [] heaparray;

return;