为什么这个片段不产生输出

时间:2013-04-18 07:57:52

标签: c++

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

尽管如此,我发现很遗憾没有显示堆栈溢出错误,但是程序只是在没有输出的情况下退出。

5 个答案:

答案 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)

你跑了两件事:

  1. 编译器\环境参数差异。堆栈器,操作系统之间的默认堆栈大小(a1,a2和a3在堆栈中分配)各不相同。因此,在堆栈不足以适应这些变量的情况下,您会遇到堆栈溢出异常
  2. 优化级别的差异(SuvP得到0.83秒):此代码执行时间将根据优化而不同。编译器可以注意到循环没有特别做任何事情,只是删除它。它可以更进一步,并意识到memset没有用,也删除它们。但如果循环按原样执行,那么双倍操作将有125万次,这将花费超过0.8秒。
  3. 您链接的帖子中的测试从一开始就存在缺陷......

答案 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)

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

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