C中violatile的用法
来源:互联网 发布:程序员的数学1 2 3pdf 编辑:程序博客网 时间:2024/06/05 17:48
1.violate影响编译器结果的输出,violate变量随时可能发生变化,与violate有关的运算不要进行编译优化,以免出错.
例如:
volatile int i=10;int j = i;...int k = i;violate告诉编译器变量i是随时可能发生变化的,每次使用i必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中.
而优化的做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错.
2.violate可能的变量种类:(1)并行设备的硬件寄存器,(2)多线程应用中被几个任务共享的变量.
3.关于violate的几个问题:
1)一个参数既可以是const还可以是volatile吗?解释为什么。
2); 一个指针可以是volatile 吗?解释为什么。
3); 下面的函数有什么错误:
int square(volatile int *ptr){return *ptr * *ptr;}下面是答案:
1)是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2); 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
3) 这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr){int a,b;a = *ptr;b = *ptr;return a * b;}由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr){int a;a = *ptr;return a * a;}4.在嵌入式中
(1)告诉编译器不进行任何的优化
(2)表示用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能把他放在cache或寄存器中重复使用
- C中violatile的用法
- mutable violatile 关键字的用法
- c中 ## 的用法
- C 中 sizeof的用法
- C中“##”符号的用法
- c中static的用法
- c 中 static的用法
- C中static的用法
- c中static的用法
- C中volatile的用法
- c中atexit的用法
- C中union的用法
- C语言中##的用法
- C语言中 ^的用法
- C中#line的用法
- C中volatile的用法
- C中 static 的用法
- C中sizeof的用法
- oracle小记之建立表空间、用户 和 ORA-28000错误
- AndroidManifest中original-package标签
- C# Lambda Expressions 简介
- android流量统计
- GIF、JPEG、PNG比较
- C中violatile的用法
- HOJ 2541 Merry Christmas
- Makefile --- updated the Static & Dynamic Lib
- sip跟xmpp协议
- 需要学习的,学习记录,需要做的事情
- Objective-C内存管理知识总结
- asp.net中System.DateTime.Now.ToString()的一些用法
- C++的封装性、继承性和多态性概念
- [DB][ORACLE]数据库活动游标数查询SQL