疫情期间手机直线:18622734798
当前位置:首页网站设计:基础篇 → 全部信息
volatile(2)
更新时间:2012/8/15 点击:1607次
先分析下上面的代码,我们使用了一句__asm {mov dword ptr [ebp-4], 0h}来修改变量a在内存中的值,如果有对这句代码功能不清楚的读者可以参考我之前的一篇《C语言的那些小秘密之堆栈》,在此就不做过多的讲解了。前面已经讲解了Debug和Release 编译方式的区别,那么我们现在来对比看下结果。注:使用vc6编译运行,如无特殊说明,均在linux环境下编译运行。读者自己在编译的时候别忘了选择编译运行的模式。

  使用Debug模式的结果为:

  1.a的值为:12

  2.b的值为:0

  3.Press any key to continue

  使用Release模式的结果为:

  1.a的值为:12

  2.b的值为:12

  3.Press any key to continue

  看看上面的运行结果我们发现在Release模式进行了优化之后b的值为了12,但是使用Debug模式的时候b的值为0。为什么会出现这样的情况呢?我们先不说答案,再来看看下面一段代码。注:使用vc6编译运行

  1.#include

  2.

  3.void main() 4.{

  5.int volatile a=12; 6.printf("a的值为:%d\n",a); 7.__asm {mov dword ptr [ebp-4], 0h}

  8.int b = a; 9.printf("b的值为:%d\n",b); 10.}

  使用Debug模式的结果为:

  1.a的值为:12

  2.b的值为:0

  3.Press any key to continue

  使用Release模式的结果为:

  1.a的值为:12

  2.b的值为:0

  3.Press any key to continue

  我们发现这种情况下不管使用Debug模式还是Release模式都是一样的结果。现在我们就来分析下,在此之前我们先说了Debug和Release 模式下编译方式的区别。

  先分析上一段代码,由于在Debug模式下我们并没有对代码进行优化,所以对于在代码中每次使用a值得时候都是从它的内存地址直接读取的,所以在我们使用了__asm {mov dword ptr [ebp-4], 0h}语句改变了a的值之后,接下来使用a值的时候从内存中直接读取,所以得到的是更新后的a值;但是当我们在Release模式下运行的时候,发现b的值为a之前的值,而不是我们更新后的a值,这是由于编译器在优化的过程中做了优化处理。编译器发现在对a赋值之后没有再次改变a的值,所以编译器把a的值备份在了一个寄存器中,在之后的操作中我们再次使用a值的时候就直接操作这个寄存器,而不去读取a的内存地址,因为读取寄存器的速度要快于直接读取内存的速度。这就使得了读到的a值为之前的12。而不是更新后的0。

  • 疫情期间手机直线:18622734798    服务邮箱:service@nfree.cn     QQ:1448132697
  • 地址:天津市河西区围堤道146号华盛广场B座22楼    

    津公网安备 12010302001042号

  • CopyRight 2006~2024 All Rights Reserved 天津市华易动力信息科技有限公司