无法初始化双数组

时间:2014-09-04 18:17:28

标签: c++ double

我有4 gig RAM以及以下引发stackoverflow异常的行:

int main()
{
     double X[4096*512], Y[4096*512], Z[4096*512];
     return 0;
}

每个双取8个字节的空间,所以我的三个数组应该是3 * 4096 * 512 * 8/1024/1024 = 48 Mbyte大,有人可以解释错误还是48 Mbyte太多处理?

3 个答案:

答案 0 :(得分:1)

您在堆栈中声明,通常OS中的堆栈是有限的(例如:1MB),您可以在编译时扩展(例如:在GCC中使用-Wl,stack_size,134217728 128Mb)但不建议。

更好地使用std::vector<double>

#include <vector>

int main() {
     std::vector<double> X(4096*512), Y(4096*512), Z(4096*512);
     return 0;
}

答案 1 :(得分:0)

如果要避免std :: vector的开销,可以在堆上分配数组

double *myArray = new double[SIZE];

并记得释放它们。

delete [] myArray;

答案 2 :(得分:0)

扩展我的评论(不是一个详尽的描述,你应该做更多的研究),有两种类型的内存,&#34; stack&#34;和#34;堆&#34;。堆栈是一个软件的本地工作内存,而堆是大池。堆栈包含函数调用的所有局部变量。函数中声明的任何本地内容都将存储在堆栈中。堆栈有一个漂亮的属性,可以&#34;推动&#34;当我们调用下一个函数时,我们进一步向下堆栈并重新开始。但这意味着堆栈内存量通常需要在程序的生命周期内保留,因此我们将其限制为少量:一般为1到几兆字节。

当你的堆栈内存不足时,你会得到一个&#34; Stack Overflow&#34; (&#34;现在就是这意味着什么!&#34;)

堆是内存的其余部分。堆是程序存储任何动态内存和(可能更复杂)全局变量的地方。堆就是mallocnew之类的内存。

每当声明一个局部变量时,它都存储在堆栈中。这对于小变量来说不是一个问题,但是像你那样的数组很容易变得很容易。

如果您不想担心newmalloc,可以使用std::vector之类的内容,这会将大量数据放在堆上,同时为您提供局部变量语义。

同样,这是&#34;基本编程&#34;所以你应该对这个主题非常熟悉。