C语言关键字_volatile

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JohnnyTim/article/details/82563148

volatile关键字

用法:1、告诉编译器不做任何优化
      2、表示用volatile定义的变量会在程序外被改变,每次都必须要从内存中读取,而不能把它放在cache或寄存器中重复使用

volatile是告诉编译器对它所修饰的对象别执行优化。volatile在进行多线程编程时要注意,而在单线程中那个就是只能起到限制编译器优化的作用。如果一个变量被volatile修饰,编译器将不会把它保存到寄存器中,而是每一次都去访问内存中实际保存给变量的位置的值。这样就避免了没有volatile修饰的变量在多线程的读写中所长生的由于编译器优化所导致的问题。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量有别的程序更新了的话,讲出现不一致的现象。
volatile int flag=1;

while(flag)
{
... ...
}
while的编译条件就不会被编译器当作无条件真。而是每一次都去内存中看一下这个flag的值是不是为真。

volatile变量的例子
1)并行设备的硬件寄存器(状态寄存器);
2)一个中断服务寄存器中会访问到的非自动变量
3)多线程应用中被几个任务共享的变量

volatile的几个问题
1)一个参数既可以是const还可以是volatile吗?为什么?
2)一个指针可以是volatile吗?为什么?
3)下面的函数有什么错误:
int square(volatile int *ptr)
{
    return *ptr * *ptr;
}

答案:1)是的,一个例子是只读状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去改变它。
2)是的。尽管这病不很常见。一个例子是打好一个中断服务自耦程序修改一个指向一个volatile型参数,编译器讲产生类似下面的代码:
int square(volatile int *ptr)
{
    int a,b;
    a = *ptr;
    b = *ptr;
    return a * b;
}
由于*ptr的值可能被意想不到地改变,因此a和b可能是不同的。结果,这段到嘛可能不是你所期望的平方值!按正确的代码如下
long square(volatile int *ptr)
{
    int a;
    a = *ptr;
    return a * a;
}

猜你喜欢

转载自blog.csdn.net/JohnnyTim/article/details/82563148