为什么当我声明一个大小为 500 x 500 的双倍矩阵时会出现堆栈溢出?
Why do I get stack overflow when I declare a matrix of double of size 500 x 500?
我正在使用 Visual Studio 2015,当我声明这样的矩阵时
double m[500][500];
在到达函数 main 的第一行代码之前,我得到了堆栈溢出。
是不是内存不够?怎么办?
因为这样的矩阵需要大约 2MB 的堆栈内存,而堆栈大部分只有 1MB,所以会出现堆栈溢出。堆栈内存大小可以在您的链接器选项中更改(或者在创建线程时 - 至少在 WinAPI 下 - Windows),它没有在语言标准中定义。即使您设置了一个堆栈大小示例:3MB,您也永远不知道有多少可用 - 您的代码执行可能深入某些函数调用,这些函数调用也为其变量使用堆栈内存。
解决方案是使用动态内存(堆)- std::vector(对于 C++):
// Allocates one memory buffer on heap, automatically manages memory.
std::vector<double> m(500*500,0);
m[499 + 499 * 500]=12;
// Not very efficent, as it allocated 500 memory buffers for each row,
// your memory will not be alligned what might cause cache misses
std::vector<std::vector<double>> m2(500, std::vector<double>(500));
m2[499][499]=12;
或:
double * m = (double *) malloc (500*500*sizeof(double));
m[x + y * 500] = 1;
free(m);
如果你想在 C 下使用它,它也可以在 C++ 下工作,但不鼓励
矩阵需要从堆中分配。对于 C 使用 malloc,对于 C++,使用 new。如果您的编译器可以选择使用更大的堆栈大小,那将是一个替代方案。
我正在使用 Visual Studio 2015,当我声明这样的矩阵时
double m[500][500];
在到达函数 main 的第一行代码之前,我得到了堆栈溢出。
是不是内存不够?怎么办?
因为这样的矩阵需要大约 2MB 的堆栈内存,而堆栈大部分只有 1MB,所以会出现堆栈溢出。堆栈内存大小可以在您的链接器选项中更改(或者在创建线程时 - 至少在 WinAPI 下 - Windows),它没有在语言标准中定义。即使您设置了一个堆栈大小示例:3MB,您也永远不知道有多少可用 - 您的代码执行可能深入某些函数调用,这些函数调用也为其变量使用堆栈内存。
解决方案是使用动态内存(堆)- std::vector(对于 C++):
// Allocates one memory buffer on heap, automatically manages memory.
std::vector<double> m(500*500,0);
m[499 + 499 * 500]=12;
// Not very efficent, as it allocated 500 memory buffers for each row,
// your memory will not be alligned what might cause cache misses
std::vector<std::vector<double>> m2(500, std::vector<double>(500));
m2[499][499]=12;
或:
double * m = (double *) malloc (500*500*sizeof(double));
m[x + y * 500] = 1;
free(m);
如果你想在 C 下使用它,它也可以在 C++ 下工作,但不鼓励
矩阵需要从堆中分配。对于 C 使用 malloc,对于 C++,使用 new。如果您的编译器可以选择使用更大的堆栈大小,那将是一个替代方案。