c++ - 为什么这个片段没有产生输出

标签 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 中调试,将抛出“堆栈溢出”异常,而如果不在 Debug模式下则不会发生错误。

这种奇怪行为的原因是什么?


编辑

所以我使用了new,这次有一个正常的输出0.83。

不过,我还是觉得奇怪,堆栈溢出错误没有显示,但程序只是退出而没有给出输出。

最佳答案

你跑了两件事:

  1. 编译器\环境参数差异。默认堆栈大小(a1、a2 和 a3 在堆栈中分配)因编译器和操作系统而异。因此,在堆栈不足以容纳这些变量的情况下,您会得到一个堆栈溢出异常
  2. 优化级别的差异(SuvP 得到 0.83 秒):此代码执行时间将因优化而异。编译器可以注意到循环没有做任何特别的事情,只是将其删除。它可以走得更远,意识到 memset 没有用,也可以删除它们。但如果按原样执行循环,那么double上有1.25亿次操作,耗时远不止0.8秒。

您链接的帖子中的测试从一开始就有缺陷...

关于c++ - 为什么这个片段没有产生输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16077475/

相关文章:

c++ - Qt QSpinBox 加速步长

c++ - 错误 C2439 : member could not be initialized

c++ - 如何从字符串执行 std::left

c++ - OpenMP:for循环避免数据竞争而不使用关键

c++ - 使用 rxcpp 进行调度和超时处理

c++ - 如何在 64 位系统中将 FILE* 转换为数字句柄?

c++ - 关于C++中的递归函数(初级)

c++ - 在Geant4中找到参与nCapture过程的核

c++ - 模式名称/写得好吗?

c++ - OpenCV:与包含 Vec3d 的矩阵和包含 double 的矩阵的矩阵乘法