关键字
来源:互联网 发布:mlpc监控软件下载 编辑:程序博客网 时间:2024/05/21 06:23
register:
为什么要声明为register变量:
为了让编译器尽可能的把变量保存在CPU内部寄存器中,这样可以省去了CPU从内存里抓取数据的时间,提高了效率。为什么要说尽可能,因为CPU的内存是有限的,不可能把所有的变量都声明为register变量。
什么时候声明register变量:
当变量被频繁的访问时。
注意事项:
①只能修饰局部变量,不能修饰全局变量和函数;因为全局变量可以被多个任务或者进程访问,只有当前进程知道register变量在哪。
②不能用&去获取一个register修饰的变量地址;因为register变量寄存在寄存器里,而&是获取内存里的地址。
③用register修饰的变量必须是CPU能够接受的类型。
static 保存在数据区的静态数据区,一般未初始化系统默认为0
①修饰一个局部变量时,延长生命周期直到函数结束再释放。
②修饰一个全局变量时,只能在本文件可见,在其他文件不可见。
③修饰一个函数时,只能在本文件调用,其他文件不可调用。
const:
①用const初始化变量一定要初始化。
②const修饰变量,这个变量就是只读变量;只读变量是空间可变,但是不可通过修饰的变量名来修改对应的空间。
③用const来修饰函数形参,可以防止函数在实现过程中修改实参的值。
使用技巧:
const int *p; //修饰指向的对象,p可变,p指向的对象不可变
int const *p; //修饰指向的对象,p可变,p指向的对象不可变
int * const p; //修饰指针p, p不可变,p指向的对象可变
const int * const p; //指针p和p指向的对象都不可变
当const距离谁近的时候,谁就不可变!typedef:
①提高代码的移植性。
②方便定义变量,把复杂的变量名变简单方便编写程序。
③方便解释变量的意义。
extern:
外部声明,声明变量是在其他文件定义的。
使用时要注意加上数据类型 如 extern int num;
volatile:
什么是volatile
volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以死代码消除。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化,volatile的字面含义是易变的。
作用:
1 在多任务、中断、甚至setjmp环境下,变量可能被其他的程序改变,编译器自己无法知道,volatile就是告诉编译器这种情况。
2 不做常量合并、常量传播等优化,
3 对volatile变量的读写不会被优化掉。如果你对一个变量赋值但后面没用到,编译器常常可以省略那个赋值***作,然而对MemoryMapped IO的处理是不能这样优化的。
前面有人说volatile可以保证对内存操作的原子性,这种说法不大准确,其一,x86需要LOCK前缀才能在SMP下保证原子性,其二,RISC根本不能对内存直接运算,要保证原子性得用别的方法,如atomic_inc。何时用:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。
- 关键字
- 关键字
- 关键字
- 关键字
- 关键字
- 关键字
- 关键字
- 关键字
- 关键字
- 关键字
- 关键字
- 关键字
- 关键字
- 关键字
- 关键字
- 关键字
- 关键字
- 关键字
- 《Java源码分析》:WeakHashMap
- 一些记录
- Codevs 2597 团伙(并查集)
- CV相关的企业
- eclipse导出的jar包不能运行
- 关键字
- 如何合理地估算线程池大小
- java I/O模型
- Java了解知识
- C#中,Json的序列化和反序列化的几种方式总结
- cutadapt
- Gtk-Message: Failed to load module "canberra-gtk-module"
- Spring+quart
- 使用 iOS 8 Spring Animation API 创建动画