0722学习记录(预处理和关键字)
2016-07-23 09:18
267 查看
register:作用是请求编译器将值尽可能保存在cpu内部寄存器中,这样将省去从内存抓取数据的时间,增快程序的运行效率。但是为什么是尽可能呢,因为寄存器的数量是有限的,我们不能将每个变量都用register来声明,一般用它来声明频繁使用的或者是循环变量,使用register要注意以下几点:1.只能修饰局部变量,不能修饰全局变量,因为全局变量会被多个任务或者说是进程所访问,但是用register声明后只有当前进程知道你这个变量所在的位置,2.不能用&符号对register声明的变量取地址,因为register声明的变量存放在寄存器中,而&是取这个变量在内存中的地址。3.register修饰的变量一定是cpu所能接收的类型。
static:static声明的变量称为静态变量,它既可以修饰变量,也可以修饰函数,当用来修饰局部变量时,它的作用就是延长局部生命周期,让程序运行完再释放。修饰全局变量使得这个变量只能在本文件被访问,其他文件不可见,声明函数使得它只能在本文件被访问。它修饰的变量保存在数据的静态数据区,若没有初始化将会默认初始化为0。写程序应该尽量少用static定义变量,全局变量比较危险,因为可能会在不同的地方被使用,改变原来的值。
const:const修饰一个变量,这个变量叫做只读变量,这个变量对应的空间是可以变化的,但不能通过修饰它的变量名来修改这个空间对应的值。例如int const num = 5; num++;这种作法就是错的,所以我们一般来用const修饰函数形参,避免修改实参的值,用const一定要初始化。
typedef:作用是给数据类型重命名,这样可以提高代码的移植性,把复杂的类型简单的声明,方便编写程序,同时,也起到了解释某些变量的作用,也就是注释作用。
最后我们来看下volatile的:就像大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果不加入volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量。
差不多就这么多了
static:static声明的变量称为静态变量,它既可以修饰变量,也可以修饰函数,当用来修饰局部变量时,它的作用就是延长局部生命周期,让程序运行完再释放。修饰全局变量使得这个变量只能在本文件被访问,其他文件不可见,声明函数使得它只能在本文件被访问。它修饰的变量保存在数据的静态数据区,若没有初始化将会默认初始化为0。写程序应该尽量少用static定义变量,全局变量比较危险,因为可能会在不同的地方被使用,改变原来的值。
const:const修饰一个变量,这个变量叫做只读变量,这个变量对应的空间是可以变化的,但不能通过修饰它的变量名来修改这个空间对应的值。例如int const num = 5; num++;这种作法就是错的,所以我们一般来用const修饰函数形参,避免修改实参的值,用const一定要初始化。
typedef:作用是给数据类型重命名,这样可以提高代码的移植性,把复杂的类型简单的声明,方便编写程序,同时,也起到了解释某些变量的作用,也就是注释作用。
最后我们来看下volatile的:就像大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果不加入volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量。
差不多就这么多了
相关文章推荐
- static 静态
- SDUT2119数据结构实验之链表四:有序链表的归并
- AUC的理解与应用场景
- 62. mybatis 使用PageHelper不生效【从零开始学Spring Boot】
- hdu 5734 Acperience (数学)
- Android--水平进度条对话框
- 复习(数据结构):队列:c语言
- java发送qq邮件进行验证
- 【机器学习】windows版caffe深度学习库编译
- POJ1328Radar Installation
- android studio出现Error:compileSdkVersion android-x requires compiling with JDK 7问题
- [2016/7/23][usaco 2.2]Subset Sums
- cin循环输入控制问题
- 建设一套直播CDN、直播平台到底有多难?
- 贪心算法
- 删除右键"上传到有道云笔记"
- 杭电ACM 2031,2057 进制转化问题
- 手游直播到底难在哪里?
- Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exc
- [李景山php]每天laravel-20160925|Pipeline.php