zoukankan      html  css  js  c++  java
  • (原)Vs中debug和release结果不一致

    转载请注明出处:

    http://www.cnblogs.com/darkknightzh/p/5598091.html

    前两天调试程序,出现了一个很蛋疼的问题,debug和release结果不一致。网上很多都说是变量没有初始化,但是我这边变量已经初始化了。

    最后仔细检查,找到了debug和release下代码结果不一致的地方。将该部分代码提取并简化,如下所示:

     1 int MatrixPlusDiagVec(float* pMat, const float* pVec, int dim)
     2 {
     3     for (int i = 0; i < dim; ++i)
     4     {
     5         pMat[i * (dim + 1)] += pVec[i];
     6     }
     7     return 0;
     8 }
     9 
    10 void ShowRowRes(const float* data, int len)
    11 {
    12     for (int i = 0; i < len; ++i)
    13     {
    14         cout << i << ' ' << data[i] << endl;
    15     }
    16 }
    17 
    18 int main()
    19 {
    20     int num = 250;
    21     float* pa = new float[num * num];
    22     memset(pa, 0, sizeof(float) * num * num);
    23 
    24     float* pb = new float[num * num];
    25     for (int i = 0; i < num; ++i)
    26     {
    27         pb[i] = (i + 1) * 5;
    28     }
    29 
    30     MatrixPlusDiagVec(pa, pb, num);
    31 
    32     ShowRowRes(pa, num);
    33 
    34     delete[] pa;
    35     delete[] pb;
    36 
    37     system("Pause");
    38 
    39     return 0;
    40 }

    其实是很简单的代码,就是将一个向量中的元素放到一个矩阵对角线上,但是debug和release结果就是不一致。调用ShowRowRes后,由于显示第一行结果,应该只有第一个元素非0,其他都是0。Debug下正常,release下前4个结果都不对。

    Debug显示第一行结果如下:

    Release显示第一行结果如下:

    Release显示第二三四行均为0,显示第5行结果:

      上述程序中float改为int后,release下结果依旧不正常。

    后来将MatrixPlusDiagVec函数中

    pMat[i * (dim + 1)] += pVec[i];

    改为

    pMat[i * (dim + 1)] = pMat[i * (dim + 1)] + pVec[i];

    或者

    pMat[i * dim + i] += pVec[i];

    或者在pMat[i * (dim + 1)] += pVec[i];之后加上一句cout

    或者使用vs2015编译程序,

    结果都正确。无论如何也理解不了为啥。

    由于不会看反汇编代码,所以就不看了。

    之后有人看了我用的vs的版本,如下:

    建议更新到update5,更新了之后,也没有问题了。如下:

    因而,猜测原因应该是vs2013我用的那个版本的bug吧。

    所以,如果程序无论如何也理解不了debug和release为啥结果不一致,那就。。。额,更新一下IDE吧。这个锅,只能IDE背了。

  • 相关阅读:
    nginx服务
    安装python
    软件包安装总结
    看内存大小
    计算机系统基础知识04
    计算机系统基础知识03
    计算机系统基础知识02
    计算机系统基础知识01
    python常用模块-logging模块
    python基础-包的使用
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/5598091.html
Copyright © 2011-2022 走看看