9

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

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

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

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

4

4 回答 4

10

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

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;

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

于 2013-06-10T17:38:59.160 回答
8

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

-Wl,--stack,36000000

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

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

于 2013-06-10T17:56:47.697 回答
4

是的,您可以在堆栈上声明这个数组(需要做一些额外的工作),但这并不明智。

没有正当理由为什么数组必须存在于堆栈中。

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

就目前而言,不要这样做。

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

于 2013-06-10T17:50:49.463 回答
0

你有什么理由特别想要这个堆栈吗?

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

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

... 

k= heaparray[456];

...

delete [] heaparray;

return;
于 2013-06-10T17:40:02.687 回答