我是这个领域的新手。以前我在做微控制器编程。我在volatile变量中使用的地方,以避免编译器优化。但是我从来没有在变量声明之前看到过这样的volatile声明。这意味着编译是在arago build中没有任何优化的情况下完成的。在这里,我有两个疑问。
答案 0 :(得分:0)
优化通常通过编译器设置来控制 - 例如编译器命令行。它不受代码控制。
然而,为了进行优化,编译器假定变量的行为类似于“正常变量”,而代码不会中断。
这可能会导致以下错误:一些示例代码:
int a;
void myFunc(void)
{
a=1;
/* Wait until the interrupt sets a back to 0 */
while(a==1);
}
void interruptHandler(void)
{
/* Some hardware interrupt */
if(a==1) doSomeAction();
a=0;
}
编译器假定没有中断。因此它会看到
因此优化编译器可能会在内部更改代码:
void myFunc(void)
{
while(1);
}
离开“易变”可以工作,但可能不会工作。
如果您没有硬件中断(并且没有并行线程,多核CPU等),“volatile”会使代码变慢并且没有任何好处,因为它不是必需的。