疫情期间手机直线:18622734798
当前位置:首页网站设计:基础篇 → 全部信息
volatile(3)
更新时间:2012/8/15 点击:1393次
第二段代码中我们使用了一个volatile修饰符,这种情况下不管在什么模式下都得到的是更新后的a的值,因为volatile修饰符的作用就是告诉编译器不要对它所修饰的变量进行任何的优化,每次取值都要直接从内存地址得到。从这儿我们可以看出,对于我们代码中的那些易变量,我们最好使用volatile修饰,以此来得到每次对其进行更新后的值。为了加深下大家的印象我们再来看看下面一段代码。

  1.#include

  2.#include 3.

  4.int main(int argc, char * argv[]) 5.{

  6. struct timeval start,end; 7. gettimeofday( &start, NULL ); /*测试起始时间*/ 8. double timeuse; 9. int j; 10. for(j=0;j<10000000;j++) 11. ;

  12. gettimeofday( &end, NULL ); /*测试终止时间*/ 13. timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec -start.tv_usec;

  14. timeuse /= 1000000;

  15.printf("运行时间为:%f\n",timeuse); 16.

  17. return 0; 18.

  19.}

  与之前我们测试时间的代码一样,我们只是增大了for()循环的次数。

  先来看看我们不使用优化的结果:

  1.root@ubuntu:/home# gcc time.c -o p

  2.root@ubuntu:/home# ./p

  3.运行时间为:0.028260

  使用了优化的运行结果:

  1.root@ubuntu:/home# gcc -o p time.c -O2

  2.root@ubuntu:/home# ./p

  3.运行时间为:0.000001

  从结果显然可以看出差距如此之大,但是如果我们在上面的代码中修改一下int j为int volatile j之后再来看看如下代码:

  1.#include

  2.#include 3.

  4.int main(int argc, char * argv[]) 5.{

  6. struct timeval start,end; 7. gettimeofday( &start, NULL ); /*测试起始时间*/ 8. double timeuse; 9. int volatile j; 10. for(j=0;j<10000000;j++) 11. ;

  12. gettimeofday( &end, NULL ); /*测试终止时间*/ 13. timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec -start.tv_usec;

  14. timeuse /= 1000000;

  15.printf("运行时间为:%f\n",timeuse); 16.

  17. return 0; 18.

  19.}

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

    津公网安备 12010302001042号

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