一、关键字volatile
编译器的优化:因为访问寄存器要比访问内存要快的多所以编译器一般都会减少存取内存的的优化,将内存变量缓存到寄存器。使用关键字volatile声明变量的时候,表示变量随时可以改变,系统总是重新从他所在的内存读取数据,也可以这么理解当使用关键字volatile时编译器就不在对该变量进行优化。
1)
假设需要对寄存器依次初始化为不同的值
int
int
{
}
}
经过编译器优化后,编译器认为前面循环半天都是废话,对最后的结果毫无影响,因为最终只是将output这个指针赋值为9,所以编译器最后给你编译编译的代码结果相当于:
int
{
}
2) 一个中断服务子程序中会访问到的非自动变量要用volatile修饰
static int i=0;
intmain(void)
{
}
voidISR_2(void)
{
}
如果没有static volatile int i = 0;每次if语句判断只使用寄存器中“i副本”
3) 多线程应用中被几个任务共享的变量
当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致
当变量在因别的线程等而改变了值,该寄存器的值不会相应改变
二、关键字static
1在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
4静态数据成员可以被一个类的n个对象共有,实现数据共享。在内存中只占一份空间,即使这个类没有定义对象,静态数据成员也会被分配空间。它不随对象的建立而分配空间,也不会因为对象的撤销而释放,程序结束时释放。访问静态数据成员:数据类型类名::静态数据成员名 (对象不存在了可以访问)
5静态成员函数没有this指针而非静态成员函数有this指针,所以不能访问这个类对象的非静态成员,可以直接访问这个类中的静态成员。
访问静态成员函数:数据类型类名::静态成员函数
三、关键字extern
const 可以定义常变量,#define可以定义常量
const 定义的有数据类型的,编译器可以对他进行类型安全检查。#define定义常量,只进行简单的替换,没有类型检查。
typedef P char *; P a,b;
#define P char *; P a,b;