C语言的那些小秘密之volatile

发表于:2011-12-19 09:31

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:bigloomy(CSDNblog)    来源:51Testing软件测试网采编

分享:

  通常在代码中我们为了防止一个变量在意想不到的情况下被改变,我们会将变量定义为volatile,这从而就使得编译器就不会自作主张的去“动”这个变量的值了。准确点说就是每次在用到这个变量时必须每次都重新从内存中直接读取这个变量的值,而不是使用保存在寄存器里的备份。

  在举例之前我们先大概的说下Debug和Release 模式下编译方式的区别,Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。大致的知道了Debug和Release的区别之后,我们下面来看看一段代码。

  1. #include <stdio.h>   
  2.   
  3. void main()  
  4. {  
  5. int 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. }

  先分析下上面的代码,我们使用了一句__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 <stdio.h>   
  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 模式下编译方式的区别。

42/4<1234>
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号