没有合适的资源?快使用搜索试试~ 我知道了~
C语言Scanf和printf和预编译指令和变量修饰符1
需积分: 0 0 下载量 75 浏览量
2022-08-08
20:57:05
上传
评论 1
收藏 26KB DOCX 举报
温馨提示
1.volatile 特点:告诉编译器不要对变量的访问进行优化,每次都只从内存中取 1.register变特点:存在CPU寄存器,访问可能提速 2.因为reg
资源推荐
资源详情
资源评论
1.volatile
特点:告诉编译器不要对变量的访问进行优化,每次都只从内存中取;对于有并行如
状态寄存器、有中断服务程序或者多线程共享的变量,应使用此修饰符。
volatile 是易变的,不稳定的意思,volatile 是关键字,是一种类型修饰符,用它修
饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其他线程等,
遇到这个关键字声明的变量,编译器对访问该变量的代码不在进行优化,从而可以提供对
特殊地址的稳定访问。那么什么是编译器优化呢?
为了提高运行效率,攻城湿们可是费尽心机地把代码优化,把程序运行时存取速度优
化。一般,分为硬件优化和软件优化。硬件优化,流水线工作,详细可以参考《计算机组
成原理》。软件优化,一部分是程序猿们做的代码优化(前提你得有优化的思路和能
力),还有一部分就是我们的编译器优化了。现代的编译器经过那么多年的发展,已经比
较成熟,把很多余的变量忽略掉,让代码的效率更高。而在默认情况下,编译器都会对代
码进行优化,为了提高存取变量的速度,会把一些变量在寄存器(要知道控制器、运算器
和寄存器是 CPU 的三大组成成分)里存取,而不是在内存里存取了,那这样 CPU 在自己
家里拿东西当然比从内存那里拿东西要快得多。举个小栗子:
int i = 5;
int a = i;
……
int b = i;
编译器发现两次从 i 读数据的代码之间,并没有对 i 进行过操作,它会自动把上次读的
数据放在 b 中,而不是重新从 i 里面读取。
而 volatile 关键字告诉编译器该变量是随时可能发生变化的,每次使用它的时候必须
从内存中取出他的值,因而编译器生成的汇编代码会从原内存地址中读取数据使用,而不
是从寄存器或者缓存中读取,从而保证了对特殊地址的稳定访问。也就是说,状态要经常
变化的,为了防止我们编译优化而导致的存取的数据不同步的问题,这时我们就需要用
到!那具体到什么场景下需要用到 volatile 关键字呢?
1、并行设备的硬件寄存器(如:状态寄存器);
2、一个中断服务子程序中会访问到的非自动变量(Non-automatic variables);
3、多线程应用中被几个任务共享的变量
上面提到了非自动变量,这里就进一步对几种变量做一番解释:
自动变量:是在函数内部定义和使用的变量,它是局部变量。
非自动变量:有两种,一种是全局变量,一种是静态变量。
全局变量:在函数外面定义的变量,只能定义一次,不能有重复的定义,不然就会发
生错误,而其他的文件要想使用这个变量,需要 extern 来声明这个变量(也可省略,因
为默认就是 extern),这个声明叫做引用声明。若不想被其他文件访问,则用 static 关
键字声明为静态变量。静态变量与自动变量的本质区别是,静态变量并不像自动变量那样
使用堆栈机制来使用内存。而是为静态变量分配固定的内存,在程序运行的整个过程中,
它都会被保持,而不会不销毁。这就是说静态变量的持续性是程序运行的整个周期。这有
利于我们共享一些数据。如果静态变量在函数内部定义,则它的作用域就是在这个函数内
部,仅在这个函数内部使用它才有效,但是它不同于自动变量的,自动变量离开函数后就
会别销毁,而静态变量不会被销毁。他在函数的整个运行周期内都会存在。
1.register 变
特点:存在 CPU 寄存器,访问可能提速;不能被取地址。
register:这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中,而不是
通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。
因为,如果定义了很多 register 变量,可能会超过 CPU 的寄存器个数,超过容
量。所以只是可能。
量必须是能被 CPU 所接受的类型。这通常意味着 register 变量必须是一个单个的
值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点
数。
2.因为 register 变量可能不存放在内存中,所以不能用“&”来获取 register 变量的
地址。由于寄存器的数量有限,而且某些寄存器只能接受特定类型的数据(如指针和
浮点数),因此真正起作用的 register 修饰符的数目和类型都依赖于运行程序的机器,
而任何多余的 register 修饰符都将被编译程序所忽略。在某些情况下,把变量保存在寄
存器中反而会降低程序的运行速度。因为被占用的寄存器不能再用于其它目的;或者
变量被使用的次数不够多,不足以装入和存储变量所带来的额外开销。
3.早期的 C 编译程序不会把变量保存在寄存器中,除非你命令它这样做,这时
register 修饰符是 C 语言的一种很有价值的补充。然而,随着编译程序设计技术的进
步,在决定那些变量应该被存到寄存器中时,现在的 C 编译环境能比程序员做出更好
的决定。实际上,许多编译程序都会忽略 register 修饰符,因为尽管它完全合法,但它
仅仅是暗示而不是命令。
剩余10页未读,继续阅读
资源评论
林书尼
- 粉丝: 28
- 资源: 315
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功