关键字
2016-07-26 11:24
162 查看
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中则只能依靠硬件的良好设计了。
为什么要声明为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中则只能依靠硬件的良好设计了。
相关文章推荐
- Codevs 2597 团伙(并查集)
- 《Java源码分析》:WeakHashMap
- java文件的创建与删除
- Python----压缩与解压缩文件
- lintcode interleaving-string 交叉字符串
- php调用接口
- 清华EMBA课程系列思考之十一 -- 金融市场与投资分析
- Spring容器深入(li)
- 学习记录2:优先队列 (二叉堆实现)
- android悬浮窗口的实现
- Linux 用户管理之相关命令
- android.view.View.setWillNotDraw(boolean willNotDraw)
- C语言修饰词之violate使用
- 卸载 jenkins 教程
- 警告: No mapping found for HTTP request with URI [] in DispatcherServlet with name
- Linux 用户管理之相关配置文件
- MySQL存储过程的优化实例
- 美容院客户的需求分析模型(REA模型)
- 字符串的组合
- 一道movfuscator混淆过的简单逆向