c#和c中的volatile有什么区别?我在一次采访中被问到这个问题。
答案 0 :(得分:16)
The article mentioned in this blog post简明扼要地解释了这些事情,并比较了C,C ++,Java和C#中volatile的用法和含义。
在这个网站上还有一些很好的问题和答案:
编辑:不要在这里混淆任何人是初始链接中提到的DDJ文章的“exact link”(这是Herb Sutter博客的链接)。
Nigel Jones的this article也解释了嵌入式C编程环境中的volatile关键字。由于这个问题似乎在一次采访中出现this other article同一位作者是我的最爱之一(“exact link”),并对C世界中的易变性有另一个很好的解释。
答案 1 :(得分:2)
在C volatile中告诉编译器不要优化对变量的访问:
int running = 1;
void run() {
while (running) {
// Do something, but 'running' is not used at all within the loop.
}
}
通常编译器可能会将'while(running)'转换为'while(1)'。当'running'变量标记为volatile时,编译器每次都被强制检查变量。
重要的是要理解,对于C'volatile'仅限制编译器进行优化,而您的硬件(即CPU缓存,指令管道等)仍可能重新排序内存访问。您的C编译器无法告诉您的硬件不进行优化。你必须自己做(例如使用内存屏障)。
据我所知(但我不完全确定)C#规范更进一步: