人工智能

C语言 volatile 关键字在编译优化过程中有何作用

时间:2010-12-5 17:23:32  作者:IT科技类资讯   来源:域名  查看:  评论:0
内容摘要:初学的读者可能不怎么关心编译器优化的功能,但对于经验丰富的工程师来说,掌握代码优化是必备技能。今天讲述的话题就是关于代码优化中,关键字volatile在优化过程中起到的作用。一、关键字 volatil

初学的语言v优化用读者可能不怎么关心编译器优化的功能,但对于经验丰富的关过程工程师来说,掌握代码优化是键字必备技能。

今天讲述的编译话题就是关于代码优化中,关键字volatile在优化过程中起到的何作作用。

一、语言v优化用关键字 volatile 是关过程什么?

volatile是一个类型修饰符(type specifier)。

volatile的键字作用是作为指令关键字,确保本条指令不会因编译器的编译优化而省略,且要求每次直接读值。何作

volatile变量是语言v优化用说这变量可能会被意想不到地改变,这样,关过程编译器就不会去假设这个变量的键字值了。

---来自百度百科

volatile的编译定义,应该在(读书)学习时都看过无数遍,云服务器提供商何作但我相信绝大部分人都没有深刻理解其中含义。

当你真正编程、开发项目之后,你就会进一步理解其中含义。

二、volatile关键字对编译器优化的影响

我们都知道编译器有优化代码的功能,我们常用的集成开发环境(Keil、 IAR等)都有优化选项。

如果不使用关键字 volatile 申明变量,则编译器可能会对变量的访问并生成非预期的代码或删除预期的功能。

1.何时使用volatile?

常见使用volatile声明的情况:

访问内存映射外设。 在多个线程之间共享全局变量。 在中断例程或信号处理程序中访问全局变量。

比如,在STM32代码中:

#define     __O     volatile             /*!< Defines write only permissions */ #define     __IO    volatile             /*!< Defines read / write permissions */ 

浏览代码,你会发现,很多地方都使用了“__IO”,也就是volatile.

在跑系统的项目中,线程间共享的全局变量,免费信息发布网建议都加上volatile关键字,这一点,很多人没有在意。

2.不使用volatile时可能出现的问题

如果未将变量用volatile声明,则编译器会假定其值不能在其定义的范围之外进行修改。

因此,编译器可能会执行不需要的优化。这可以通过多种方式表现出来:

在轮询硬件时,代码可能会陷入循环。 多线程代码可能会表现出奇怪的行为。 优化可能会导致删除实现故意时序延迟的代码。

举例:

自己写一个延时函数:

void Delay(int Cnt) {   int i;   while(Cnt--)   {     i++;     for(i=0; i<10; i++);   } } 

你在不同优化等级情况下,延时时间可能会不一样;

同样的代码,你在Keil 和 IAR环境下编译出来的延时时间也可能不一样。

当然,更深入的理解就会牵涉到汇编代码,编译之后的汇编代码会比较直观的呈现差异。 
Ubuntu Trusty带来的是3.13.0 Linux kernel ,需要准备所有ubuntu库的某些条件,docker安装包被称之为docker.io。(注:Ubuntu (和Debian)包含有一些比较旧的同样被称之为docker的KDE3/GNOME2安装包,因此此处的docker安装包被称之为docker.io。)安装:安装ubuntu下的安装包(可能不是最新的)$ sudo apt-get update $ sudo apt-get install docker.io $ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker $ sudo sed -i $acomplete -F _docker docker /etc/bash_completion.d/docker.io $ source /etc/bash_completion.d/docker.io假如你想尝试一下最新版打docker首先,你要检查一下APT系统能够被https解析,URLs:文件/usr/lib/apt/methods/https应该已经存在了,假如没有,你需要安装软件包apt-transport-https![ -e /usr/lib/apt/methods/https ] || { apt-get update apt-get install apt-transport-https }之后,添加Docker repository key到本地keychain$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9添加docker软件仓库到软件源,升级软件源,安装lxc-docker包!$ sudo sh -c echo deb https://get.docker.com/ubuntu docker main >/etc/apt/sources.list.d/docker.list $ sudo apt-get update $ sudo apt-get install lxc-docker注:有个简单脚本可以用于这个过程$ curl -sSL https://get.docker.com/ubuntu/ | sudo sh验证所有的工作都如预期完成了$ sudo docker run -i -t ubuntu /bin/bashOK,完毕!谢谢阅读,希望能帮到大家,请继续关注脚本之家,我们会努力分享更多优秀的文章。
全面解析以dx二代(探索dx二代的新特性与改进,提升使用者的满意度)
copyright © 2025 powered by 编程之道  滇ICP备2023006006号-34sitemap