volatile与指针
来源:互联网 发布:网络爬虫需要什么软件 编辑:程序博客网 时间:2024/06/18 16:50
volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
volatile修饰指针一般用在共享指针上面。
下面代码:
- uchar * volatile reg;
行代码里volatile修饰的是reg这个变量。所以这里实际上是定义了一个uchar类型的指针,并且这个指针变量本身是volatile 的。但是指针所指的内容并不是volatile的!在实际使用的时候,编译器对代码中指针变量reg本身的操作不会进行优化,但是对reg所指的内容 reg却会作为non-volatile内容处理,对reg的操作还是会被优化。通常这种写法一般用在对共享指针的声明上,即这个指针变量有可能会被中断等函数修改。将其定义为volatile以后,编译器每次取指针变量的值的时候都会从内存中载入,这样即使这个变量已经被别的程序修改了当前函数用的时候也能得到修改后的值(否则通常只在函数开始取一次放在寄存器里,以后就一直使用寄存器内的副本)。
需要注意将上述代码与下面的代码进行区别
- volatile uchar *reg;
这行代码里volatile修饰的是指针所指的内容。所以这里定义了一个uchar类型的指针,并且这个指针指向的是一个volatile的对象。但是指针变量本身并不是volatile的。如果对指针变量reg本身进行计算或者赋值等操作,是可能会被编译器优化的。但是对reg所指向的内容 reg的引用却禁止编译器优化。因为这个指针所指的是一个volatile的对象,所以编译器必须保证对reg的操作都不被优化。通常在驱动程序的开发中,对硬件寄存器指针的定义,都应该采用这种形式。
而
- volatile uchar * volatile reg;
这样定义出来的指针就本身是个volatile的变量,又指向了volatile的数据内容。
- volatile与指针
- volatile与指针
- C++当中volatile指针与const指针的真正含义(一)。
- C语言多继承时子类与基类指针关系,union与struct区别,volatile修饰符作用
- volatile原理与技巧
- transient与volatile温故而知新
- volatile 与诡异事件
- volatile原理与技巧
- const与volatile
- volatile 与内存屏障
- Volatile与多线程
- 浅谈Volatile与多线程
- volatile原理与技巧
- synchronized与volatile异同
- Volatile与多线程
- volatile与const
- C# volatile 与 lock
- C# volatile 与 lock
- 手动控制IIS服务的开启与关闭
- 基于API的录音机程序(转)
- 自定义Android标题栏TitleBar
- int 和 String 互相转换的多种方法
- libssh2编译错误(configure error: cannot find OpenSSL or Libgcrypt)解决方法
- volatile与指针
- Java运算符优先级及结合性与C语言之比较
- android 学习教程五---- 四大组件之一Activity 详解
- requestWindowFeature()的应用
- Linux 设备驱动
- 批处理
- 指针与引用
- MCI和波形(转)
- eclipse运行速度优化(解决狂读盘、发布慢、CPU100%等问题)