b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

strchr函数返回_strchr函数是什么缩写_c++ strchr函数(13)

电脑杂谈  发布时间:2017-02-22 07:23:41  来源:网络整理

<3>register 寄存器(一个用法,修饰变量,作用是让编译器把这个变量放在寄存器中,当这个变量频繁的被使用时,用这个方法可以提高效率,但有时候不一定就放在寄存器,因为寄存器是有限的,没有剩余的寄存器了)

<4>extern (一个用法,修饰全局变量,表示该文件要使用的这个变量,在另外一个c文件中已经定义了,其一个声明的作用,不能初始化)

<5>volatile (一个用法,修饰变量,表示对这个变量的语句不要去优化)

(1) volatile的字面意思:可变的、易变的。C语言中volatile用来修饰一个变量,表示这个变量可以被编译器之外的东西改变。编译器之内的意思是变量的值的改变是代码的作用,编译器之外的改变就是这个改变不是代码造成的,

或者不是当前代码造成的,编译器在编译当前代码时无法预知。譬如在中断处理程序isr中更改了这个变量的值,譬如多线程中在别的线程更改了这个变量的值,譬如硬件自动更改了这个变量的值(一般这个变量是存在寄存器,

或许当其他进程要用到这个寄存器时,就把这个寄存器的变量给改变了,同时也就改变了这个变量)

(2) 以上说的三种情况(中断isr中引用的变量,多线程用的变量,硬件会更改的变量)都是编译器在编译时无法预知的更改,此时应用使用volatile告诉编译器这个变量属于这种(可变的、易变的)情况。编译器在遇到volatile修饰

的变量时就不会对改变量的访问进行优化,就不会出现错误。

(3) 编译器的优化在一般情况下非常好,可以帮助提升程序效率。但是在特殊情况(volatile)下,变量会被编译器想象之外的力量所改变,此时如果编译器没有意识到而去优化则就会造成优化错误,优化错误就会带来执行时错误。

而且这种错误很难被发现。

(4) volatile是程序员意识到需要volatile然后在定义变量时加上volatile,如果你遇到了应该加volatile的情况而没有加程序可能会被错误的优化。如果在不应该加volatile而加了的情况程序不会出错只是会降低效率。

所以我们对于volatile的态度应该是:正确区分,该加的时候加不该加的时候不加,如果不能确定该不该加为了保险起见就加上。

举例子1: int a=3 ,b,c;

b=a;

c=b;

那么编译器会优化成 c=b=a=3; 如果此时遇到上述三种情况,突然改变了a的值,那么,对于没有优化前是对的,但是对于优化后,那么c仍然是3,就会出错。

所以当我们程序员知道这个变量会发生改变时,就应该加 volatile,提示编译器不要帮我们做优化。

举列子2: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;

}

举例子更多:

<6> restrict (1)c99中才支持的,所以很多延续c89的编译器是不支持restrict关键字,gcc支持的。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33816-13.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...