我正在阅读Use Python for Scientific Computing,并决定自己测试代码。所以C ++代码是(有点修改)
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <cstring>
int main() {
std::clock_t begin = std::clock();
double a1[500][500];
double a2[500][500];
double a3[500][500];
memset(a1, 0, 500*500*sizeof(double));
memset(a2, 0, 500*500*sizeof(double));
memset(a3, 0, 500*500*sizeof(double));
int i, j, k;
for(i = 0; i < 500; i++) {
for(j = 0; j < 500; j++) {
for(k = 0; k < 500; k++) {
a3[i][j] += a1[i][k] * a2[k][j];
}
}
}
std::clock_t end = std::clock();
std::cout << (double)(end - begin) / (double)CLOCKS_PER_SEC<<std::endl;
return 0;
}
这是一个非常简单的代码,但奇怪的是根本没有生成输出。不是0,但根本没有。我尝试过VC11和MinGW 4.7,但它们都没有产生任何效果。只有当删除里面的for
循环时,此代码才会生成一个输出,即0。
如果我在VS 2012中调试,将抛出“堆栈溢出”的异常,而如果不在调试模式下则不会发生错误。
这种奇怪行为的原因是什么?
修改
所以我使用了new
,这次正常输出为0.83。
尽管如此,我发现很遗憾没有显示堆栈溢出错误,但是程序只是在没有输出的情况下退出。
答案 0 :(得分:1)
这肯定是堆栈溢出。在VS 2008上它给了我Unhandled exception at 0x00ef18d7 in Test.exe: 0xC00000FD: Stack overflow.
chkstk.asm
test
命令发生错误:
; Find next lower page and probe
cs20:
sub eax, _PAGESIZE_ ; decrease by PAGESIZE
--> test dword ptr [eax],eax ; probe page.
jmp short cs10
_chkstk endp
要解决此问题,请使用new
分配器作为@sarat提及的分配:
double** a1 = new double*[500];
for(int i = 0; i < 500; ++i)
a1[i] = new double[500];
答案 1 :(得分:1)
你跑了两件事:
memset
没有用,也删除它们。但如果循环按原样执行,那么双倍操作将有125万次,这将花费超过0.8秒。您链接的帖子中的测试从一开始就存在缺陷......
答案 2 :(得分:1)
Visual Studio:
您正尝试将(提交)6MB放在堆栈上,而在x86和x64上,默认保留堆栈大小为1MB,在Itanium上,默认保留堆栈大小为4MB。你承诺的不能超过你的保留。
在Visual Studio中更改预定义的预留堆栈大小,您应该转到Project Properties-&gt; Linker-&gt; System-&gt; Stack Reserve Size,将值设置为10000000(10MB),您将不会有任何问题。
答案 3 :(得分:0)
这会导致堆栈溢出。尝试使用new而不是local array声明。
这应该有所帮助:How do I use arrays in C++
答案 4 :(得分:0)
如果不在调试模式下,您的代码只会崩溃/冻结,修复堆栈溢出并完成。
增加堆栈大小(链接器堆栈选项)。