第一章: 关键字
最易变的关键字----volatile
说到volatile的易变让我想起了一个星座....你猜才是什么星座?--- 双子座!双子座的人是一个多变性格出了名的;
volatile用它修饰的变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件、线程 其他等;遇到这个关键字声明的变量,编译器对访问该变量的代码不再进行优化,从而可以提供对特殊地址的稳定访问。
先看看下面的例子:
int i=10;
int j=i; //(1)语句
int k=i; //(2)语句
此时编译器对代码优化,这是因为在(1)(2)两条语句中i没有被用作左值(没有被赋值)。这时编译器认为i没有发生改变,所以在(1)语句时内存中取出i的值赋值给j之后,这个值并没有被丢掉,而是在(2)语句时继续用这个值给k赋值。编译器不会生成出汇编代码重新从内存里取出i的值,这样提高了效率。但要注意:(1)(2)语句之间确认i没有被用作左值才行。
再看一个例子:
volatile int i=10;
int j=i; //(3)
int k=i; //(4)
volatile关键字告诉编译器,i是随时可能发生变化的,每次使用它的时候必须从内存中取出i的值,因而编译器生成汇编代码会重新从i的地址处读取数据放在k中。
由上面两个例子看出,如果i是一个寄存器变量,表示一个端口数据或者是多个线程的共享数据,那么就容易出错,所以说volatile可以保证对特殊地址的稳定访问。但注意:在Visual C ++ 6.0中,一般Debug 模式没有进行代码优化,所以这个关键字的作用可能看不出来。
留个问题:
const volatile int i=10;
这行代码有没有问题??如果没有,那么i到底是什么属性?如果有,说说见解....
我觉得有问题:const 修饰的变量具有:只读不可变性 ;而volatile 修饰的变量具有:易变性;这又是可变、又是不可变的到底属于什么变呀?莫非是蔡依林的《看我72变》?
其实:说句大实话,volatile 在嵌入式里是很常见的,所以这个学嵌入式的你懂的....
神奇的-----struct 关键字
struct 它将一些相关联的数据打包成一个整体,方便使用。
在网络协议、通信控制、嵌入式系统、驱动开发等地方,我们经常需要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。经验不足的开发人员往往将所有需要传送的内容依顺序保存在char型数组中。通过指针偏移的方法来传送网络文报等信息。这样做变成复杂,易出错,而且一旦控制方式和通信协议有所变化,程序就要进行非常细致的修改,非常容易出错。
这个时候就需要一个结构体就能搞定。平时我们要求函数的参数尽量不多于4个,如果函数的参数多于4个使用起来就非常容易出错,这时候可以用结构体压缩参数个数。