Home > IT > volatile & register

volatile & register

分享家:Addthis中国

昨天Rick Lee面试,说被问到了一个volatile关键字的作用。
初闻这个关键字,感觉回到了大一的时候,已经很多年没接触过这个关键词了,真是汗哪。

于是,为了拾起这份忘却的记忆,特地查了下MSDN中关于C#里面volatile的信息。

C#中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这个关键字了。

You don't feel like leaving comments? Please leave your palm-print.
懒得留言?那留下您的掌印吧。
Categories: IT Tags: , , , ,
  1. No comments yet.
  1. No trackbacks yet.

:D 8) :down: 8O :!: :halo: :evil: :heart: :kiss: :lol: :money: :mrgreen: :x :| :pirate: :?: :oops: :roll: :P :( :) :o :up: :vangry: :twisted: ;) :? :cry:

也许您会觉得ReCAPTCHA验证码很繁琐,会认为他和其他所有的验证码一样让你厌烦。那请点击这里,您会了解到ReCAPTCHA为人类文化的传承做出了多大的贡献。请您也为人类知识的保存和传递也出一份力吧,谢谢!
 
    Posts Nav.