美文网首页
C&C++ volatile关键字用法

C&C++ volatile关键字用法

作者: 深红的眼眸 | 来源:发表于2020-02-11 09:50 被阅读0次

    本文根据众多互联网博客内容整理后形成,引用内容的版权归原始作者所有,仅限于学习研究使用,不得用于任何商业用途。

    一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

    1. 并行设备的硬件寄存器(如:状态寄存器)
    2. 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
    3. 多线程应用中被几个任务共享的变量

    下边有几个问题:

    1. 一个参数既可以是const还可以是volatile吗?解释为什么。

    是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

    1. 一个指针可以是volatile 吗?解释为什么。

    是的。尽管这并不很常见。一个例子是当一个服务子程序修该一个指向一个buffer的指针时。

    1. 下面的函数有什么错误
    int square(volatile int *ptr)
    
    {
    
      return *ptr * *ptr;
    
    }
    

    这段代码有点变态。这段代码的目的是用来返指针ptr指向值的平方,但是,由于ptr指向一个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;
    
    }
    

    参考文献
    C中的volatile用法

    相关文章

      网友评论

          本文标题:C&C++ volatile关键字用法

          本文链接:https://www.haomeiwen.com/subject/upptfhtx.html