C++ 无法初始化双数组

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

我有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中使用
-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;