免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3078 | 回复: 7
打印 上一主题 下一主题

v o l a t i l e这个关键字是干吗的?什么时候需要用到? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-02-04 09:48 |只看该作者 |倒序浏览
v o l a t i l e这个关键字是干吗的?什么时候需要用到?

看了点资料,好象是说什么:
v o l a t i l e的语法与c o n s t是一样的,但是v o l a t i l e的意思是“在编译器认识的范围外,这个数据可以被改变”。


不明白什么意思~~
谁能帮解释一下。谢谢

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-02-04 10:07 |只看该作者

v o l a t i l e这个关键字是干吗的?什么时候需要用到?

比如说在串口编程中,
你去取一个端口的值,
端口的值可能会被外部的程序写数值而变化。
因为你不知道端口的值什么时候会变化,
所以你需要用到volatile这个关键字,
来限定代表这个端口的变量。
告诉编译器不要对这个变量做优化,
每次用到这个变量时,都要去实际读一下这个变量。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2005-02-04 10:09 |只看该作者

v o l a t i l e这个关键字是干吗的?什么时候需要用到?

就是告诉编译器,不要对我的这个变量进行优化。因为有时候,编译器的优化会造成逻辑上的错误。

论坛徽章:
0
4 [报告]
发表于 2005-02-04 10:28 |只看该作者

v o l a t i l e这个关键字是干吗的?什么时候需要用到?

多谢2位斑竹,还有个问题:
编译器是怎么对变量进行优化的?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2005-02-04 11:09 |只看该作者

v o l a t i l e这个关键字是干吗的?什么时候需要用到?

编译器不仅对变量进行优化,同时在各个方面也进行优化以提高程序的运行速度和减少占用的空间。呵呵。编译器的优化可是一个大话题。不过,机器终究是机器,即使terminater也是机器,^_^。所以有时候优化的会有问题,这个时候就要用到volatile这个关键字了。

论坛徽章:
0
6 [报告]
发表于 2005-02-05 10:31 |只看该作者

v o l a t i l e这个关键字是干吗的?什么时候需要用到?

1 这个变量在程序中可能被更改!
2 防止编译器做不适当的优化!

论坛徽章:
0
7 [报告]
发表于 2005-02-07 15:30 |只看该作者

v o l a t i l e这个关键字是干吗的?什么时候需要用到?

刚看过《 C++ PRIMER(3RD)》
书上也是这样说的
这么说const就是局限  在文件内了?!

论坛徽章:
0
8 [报告]
发表于 2005-02-16 16:51 |只看该作者

v o l a t i l e这个关键字是干吗的?什么时候需要用到?

编译优化中有一种称为窥孔优化,
窥孔优化中其中的一类是“删除无用代码”,比如:

a = 0;
a = 5;

那么第一条代码会被删除,有同学会问删除怎么了?程序没错啊。普通情况下没错,但是
有些硬件的驱动要求连续若干代码向同一个地址写数据,比如:

int addr = 0x100000;

*((char *)(addr)) = 0x5;
*((char *)(addr)) = 0x100;
*((char *)(addr)) = 0x6;

假设上面的意思是向从 0x100000 开始的设备的 0x100 的 offset 上写入 0x6。

如果被编译器优化掉前两句,硬件就无法工作。所以 addr 应该使用 volatile 声明。

另外编译器对循环的优化也会导致程序在多线程或者处理中断的环境下的某些情况下出错,比如:

int end = 0;

线程1:
...
end = 1;
...

线程2:
while(!end)
{
...
}

线程2的while会被编译器优化成死循环,永远不会退出。
循环的优化说起来实在太复杂了,楼主可以看看关于编译元理的书。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP