当前位置 博文首页 > 2021跟着小虎玩着去软考:面试点:解读关键字volatile(C语言面试

    2021跟着小虎玩着去软考:面试点:解读关键字volatile(C语言面试

    作者:[db:作者] 时间:2021-09-17 18:19

    面试点:解读关键字volatile

    C语言面试题分析之一

    一.volatile是什么?

    volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

    二.编译器优化是什么意思?

    int i = 5;

    int a = i;

    ……

    int b = i;

    编译器发现两次从i读数据的代码之间,并没有对i进行过操作,它会自动把上次读的数据放在b中,而不是重新从i里面读

    三.哪些情况,改变了内存中变量的值,编译器不知道?

    1.多线程应用中被几个任务共享的变量;

    2.一个中断服务子程序中会访问到的非自动变量;

    3.并行设备的硬件寄存器(如:状态寄存器);

    四.何时需要使用volatile这个关键字?

    嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用会经常要求定义为volatile类型的变量。

    五.使用volatile带来什么好处?

    volatile int nCount;

    当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

    六.3个经典的volatile问题

    1). 一个参数既可以是const还可以是volatile吗?解释为什么。
    2).
    一个指针可以是volatile 吗?解释为什么。
    3).
    下面的函数有什么错误:
    int square(volatile int *ptr)
    {
    return *ptr * *ptr;
    }
    下面是答案:
    1).
    可以是。例如对于只读的状态寄存器而言,如果它仅仅是volatile类型,那么它还是可能被意想不到的改变。但它还是const的时候,程序就不应该试图去修改它
    2).
    可以是的。

    尽管这种情况并不常见,但它还是可以。一个例子就是:

    当一个中断服务子程序企图去修改一个指向一个buffer指针的时候。
    3).
    这段代码可能有点恶作剧的味道。但它很好说明volatile类型参数的含义和作用。

    这段代码的目的是用来返指针*ptr所指向的值的平方,

    但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
    int square(volatile int *ptr)
    {
    int a,b;
    a = *ptr;
    b = *ptr;
    return a * b;
    }
    由于*ptr的值可能被意想不到地该变,因此ab可能是不同的。结果,这段代码可能返不
    是你所期望的平方值!正确的代码如下:
    long square(volatile int *ptr)
    {
    int a;
    a = *ptr;
    return a * a;
    }

    七.总结

    1.使用volatile关键字修饰的变量,可以避免编译器优化;

    2.使用volatile关键字修饰的变量,每次都是重新读取内存中的值,而不是使用保存在寄存器里的值了

    3.编译器优化的做法是:

    int i = 5;

    int a = i;

    ……

    int b = i;

    编译器发现两次从i读数据的代码之间,并没有对i进行过操作,它会自动把上次读的数据放在b中,而不是重新从i里面读

    cs
    下一篇:没有了