我有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太多处理?
答案 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;)
堆是内存的其余部分。堆是程序存储任何动态内存和(可能更复杂)全局变量的地方。堆就是malloc
和new
之类的内存。
每当声明一个局部变量时,它都存储在堆栈中。这对于小变量来说不是一个问题,但是像你那样的数组很容易变得很容易。
如果您不想担心new
或malloc
,可以使用std::vector
之类的内容,这会将大量数据放在堆上,同时为您提供局部变量语义。
同样,这是&#34;基本编程&#34;所以你应该对这个主题非常熟悉。