C++ 无法初始化双数组
我有4 gig RAM和以下几行引发stackoverflow异常:C++ 无法初始化双数组,c++,double,C++,Double,我有4 gig RAM和以下几行引发stackoverflow异常: int main() { double X[4096*512], Y[4096*512], Z[4096*512]; return 0; } 每个double占用8字节的空间,因此我的三个数组应该是3*4096*512*8/1024/1024=48 MB,有人能解释错误或者48 MB太多而无法处理吗?您在堆栈中声明,通常操作系统中的堆栈是有限的(例如:1MB),您可以在编译时扩展(例如:在GCC中使用-W
int main()
{
double X[4096*512], Y[4096*512], Z[4096*512];
return 0;
}
每个double占用8字节的空间,因此我的三个数组应该是3*4096*512*8/1024/1024=48 MB,有人能解释错误或者48 MB太多而无法处理吗?您在堆栈中声明,通常操作系统中的堆栈是有限的(例如:1MB),您可以在编译时扩展(例如:在GCC中使用
-Wl,堆栈大小,134217728
128Mb)但不要推荐
最好使用std::vector
#包括
int main(){
向量X(4096*512),Y(4096*512),Z(4096*512);
返回0;
}
如果要避免std::vector的开销,可以在堆上分配数组
double *myArray = new double[SIZE];
记得释放他们
delete [] myArray;
扩展我的评论(不是详尽的描述,你应该做更多的研究),内存有两种类型,“堆栈”和“堆”。堆栈是一个软件的本地工作内存,而堆是一个大池。堆栈保存函数调用的所有局部变量。函数中声明的任何本地内容都将存储在堆栈上。堆栈有一个漂亮的属性,它可以被“推送”:当我们调用下一个函数时,我们沿着堆栈往下走,然后重新开始。但这意味着堆栈内存的数量通常需要在程序的生命周期内保留,因此我们将其限制在一个较小的数量:一般为1到几兆字节
当堆栈内存用完时,会出现“堆栈溢出”(“这就是它的意思!”)
堆是剩余内存的一部分。堆是程序存储任何动态内存和(可能更复杂)全局变量的地方。堆是malloc
和new
之类的东西放置内存的地方
无论何时声明局部变量,它都存储在堆栈上。对于小变量来说这不是个问题,但是像您拥有的数组这样的数组很容易实现
如果您不想担心new
或malloc
,您可以使用std::vector
之类的工具,这将把大量数据放在堆上,同时为您提供局部变量语义
同样,这是“基本编程”,所以您应该真正熟悉这个主题。太多了。另一件无论如何分配都要记住的事情是分割内存,使其不连续,例如,
double*X[4096]
@Claptrap取决于什么?您是说,s/he应该为每行分配一个数组以防止碎片,但这些数组足够小,因此内存碎片不应该是一个问题……另一方面,管理、复制和遍历512个不同的缓冲区可能非常烦人,除非您小心,否则每次查找需要2次内存命中。
delete [] myArray;