几天前我接受了采访,但仍然在寻找答案。 我想了解使用volatile关键字的重要性。
找到以下代码:两种不同的场景。
//project1
//File1.c
int abc;//Global variable
/*And this variable is getting used in some other files too.*/
if(abc == 3) //Say
{
printf("abc == 3");
}
else
{
printf("abc != 3");
}
/*So if or else part will not be optimized
because "abc" can not be predicted,
the value can chage at any point of time */
//Project2
//file1.c
volatile int abc;//Global variable with volatile keyword
/*And this variable is getting used in some other files too.*/
if(abc == 3) //Say
{
printf("abc == 3");
}
else
{
printf("abc != 3");
}
/*So if or else part will not be optimized
because "abc" can not be predicted as it is declared as volatile,
the value can chage at any point of time */
为什么我们应该使用volatile关键字?
答案 0 :(得分:6)
正如Tony Delroy在评论中解释的那样,extern和volatile是完全不同的。
易失性关键字可保护您的变量不会被积极优化。优化变量对于其他线程是不可见的,并且永远不会到达主存储器。有时,如果不需要,编译器可以even squeeze entirely变量。编译器根据您的源代码作为其唯一输入。有时,有一些外部事件可以改变您的变量值。例如,它可以是硬件设备或其他过程。
=>具体而言,编译器禁用对此变量的一些优化,因此它可以按照您的意愿运行。
外部与缓存与内存无关。 Extern 只是访问一个存在于其他目标文件中的变量。请参阅this short example,了解为 extern 访问生成的汇编代码类型。 那些 extern 变量尽可能在自己的目标文件中进行优化。毫无疑问是要保护它。
=>具体而言,编译器指示需要在链接时解决的外部引用
答案 1 :(得分:4)
易变表示始终从内存加载/存储值,无论本地,静态还是 extern 这个vlaue(但在本地情况下并不总是有意义的。)
在常规来源中使用 volatile 关键字也是非常规的。在内核/驱动程序开发的特殊情况下,它仅适用于将硬件寄存器映射到内存的硬件(如ARM体系结构中)。
如果您在GUI或电子商务代码中使用易失性,那么您可能错了......
答案 2 :(得分:2)
volatile
通常表示以下一项或多项:
volatile
意味着在程序的整个生命周期中,有两个(或更多)读取变量的R1和R2,而R1和R2之间发生的一些其他事件将改变正常流量之外的变量执行。
extern
表示变量已在其他地方定义,并且程序正在重用该定义。
答案 3 :(得分:-1)
本质上,volatile用于表示变量的值将被不同的线程修改。
声明一个易变的Java变量意味着:
The value of this variable will never be cached thread-locally: all reads and writes will go straight to "main memory";
Access to the variable acts as though it is enclosed in a synchronized block, synchronized on itself.
Extern本质上意味着所有模块都可以使用定义的变量。