Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40309
  • 博文数量: 11
  • 博客积分: 415
  • 博客等级: 下士
  • 技术积分: 125
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-24 23:47
文章存档

2012年(1)

2010年(10)

我的朋友

分类: C/C++

2010-04-28 23:11:44

volatile的主要用法是在声明的时候加上这个关键字。
public volatile int i;

就针对编译器而言,volatile所做的就是要求变量必须保存在内存中,而不允许被编译器进行优化放入缓存或者寄存器等等。
如果从作用上而言的话,我觉得它主要是用来防止脏数据的出现。

变量如果没有加入volatile修饰,可能会被编译器优化后写入缓存或者寄存器等等。在多线程情况下,并且多个线程对这个变量会进行频繁读写的话,那就会出现脏数据。即,如果一个线程修改了这个变量的值,但是变量新值还未及时更新到缓存或者寄存器时,另外一个线程一旦访问缓存或者寄存器,就会获取没有及时更新的脏数据。就有可能出现严重的错误!

既然提到了volatile,当然也少不了了register这个关键字。
register在C中的用法

register int var;

这个关键字的工作和volatile恰恰相反。
就是变量要求写入寄存器中。这种方式特别适用于不需要经常修改,但是会被频繁访问的变量,这样可以一定程度上提高访问效率。在ANSI C语言中,由于用了register,变量需要写入寄存器而不在内存中,所以利用&取址运算符是无法获取地址的,即,&取址运算符不能用于register修饰的变量。
这个在MSDN中也是有写到的

ANSI C does not allow for taking the address of a register object; this restriction does not apply to C++. However, if the address-of operator (& ) is used on an object, the compiler must put the object in a location for which an address can be represented. In practice, this means in memory instead of in a register.

当然由于现在编译器有很多,所以针对于register的编译方法也不尽相同了。
很多编译器其实不再对register关键词进行处理了,在编译时候编译器依然自行决定变量是否进行优化。一些C/C++编译器(例如Visual C++等),你依然可以对register修饰的变量进行取址。
很多新的编译器,不再像比较老的C编译器了,都已经可以很好的对变量是否写入寄存器进行很好的选择和优化,所以有些语言甚至去掉了register这个关键字。

C#语言中就没有register这个关键字了。

阅读(2201) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~