2013-04-18 54 views
1

我在读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。

不过,我发现好奇的是没有显示堆栈溢出错误,但程序只是退出而没有提供输出。

+3

你等了多少时间? – UmNyobe

+1

我在'gcc 4.6.3'上得到了'0.83' [各种] –

+0

我想知道这是不是给你堆栈溢出。尝试使用新的而不是本地数组声明。 – sarat

回答

1

你跑有两件事:

  1. Compi ler \环境参数不同。默认堆栈大小(a1,a2和a3在堆栈中分配)因编译器和操作系统而异。因此,在堆栈不足以适应这些变量的情况下,您会遇到堆栈溢出异常
  2. 优化级别差异(SuvP得到0.83秒):根据优化,此代码执行时间将有所不同。编译器可以注意到这个循环没有什么特别之处,只是删除它。它可以更进一步,并意识到memset没有用,并将其删除。但是如果循环是按原样执行的,那么在双精度上有1.25亿次操作,这将花费比0.8秒多得多的操作。

在您链接后的测试是从一开始就存在缺陷......

+0

这是如何解释没有得到任何输出的? – jogojapan

+0

“有双倍的1.25亿次操作,这将花费比0.8秒更多” - 0.8对我来说似乎是现实的。 –

+0

@jogojapan我现在无法进行测试,但是如果我们用随机值初始化数组,强制执行循环,则需要几秒钟才能完成。 – UmNyobe

1

这绝对是一个堆栈溢出。 2008年VS它给了我Unhandled exception at 0x00ef18d7 in Test.exe: 0xC00000FD: Stack overflow.

而在test命令chkstk.asm出现错误:

; 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]; 
0

如果不是在调试模式下的代码只需崩溃/冻结,修复堆栈溢出,它会完成。

增加堆栈大小(链接器堆栈选项)。

1

的Visual Studio:

你正试图把(提交)6MB堆栈以及x86和x64系统的默认保留堆栈大小为1MB,在Itanium系统的默认保留堆栈大小为4MB。你不能承诺超过你保留的。

在Visual Studio中更改预定义的保留堆栈大小,您应该转到项目属性 - >链接器 - >系统 - >堆栈保留大小,将值设置为10000000(10MB),并且不会有任何问题。

相关问题