当前位置:网站首页>register关键字
register关键字
2022-07-03 07:42:00 【是北豼不太皮吖】
前言
编译器的优化很大程度上就是通过数据流分析、调整读取内存的顺序等,减少CPU对内存的读写。因为内存的运行速度相对于CPU是很慢的,计算机中添加cache就是为了解决CPU和内存运行速度差异过大的问题。就运行速度来说:寄存器>cache>内存>外存;就价格来说刚好相反:寄存器>cache>内存>外存。这也是寄存器和cache的读取速度最快,但是计算机中寄存器和cache的容量却很小的原因, 你可以买到1T的硬盘但是没买不到1T的内存条,价格太高,有也买不起。寄存器的数量和功能在Soc中是固定的,后期没法扩展,寄存器资源是稀缺的,对寄存器的操作要谨慎。
register关键字的作用
register:这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个 CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多 register 变量,它累死也可能不能全部把这些变量放入寄存器吧,轮也可能轮不到你。
register关键字的应用场景
当一个变量会被频繁调用时,可以用register去修饰变量,将变量保存在寄存器中,可以提升访问变量的速度。
register关键字的注意事项
1.register变量必须是能被CPU所接受的类型。变量保存在寄存器中,那表示变量的程度不能超过寄存器的位数并且类型要和寄存器接受的数据类型一致。通常情况register修饰的变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。如果寄存器允许存放浮点数,那register修饰的变量也可以是浮点数。
2.因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。用register修饰的变量是不一定会存放在寄存器中的,用register修饰只是建议将该变量保存到寄存器,并不是强制性的。
3.register关键词只能用于局部变量(即代码块中的变量),不能用于修饰全局变量。
4.局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c。我猜测原因是:静态变量的生命周期和整个程序的生命周期是一样的,总不能分配一个寄存器一直被一个变量占用,寄存器资源是很宝贵的,这样太浪费。
5.不能定义任意多个寄存器变量,原因很简单Soc的寄存器太少了。就算你用register修饰都不一定会放在寄存器中,更别说还要定义多个。个人觉得,这些特殊的关键字,没十足的把握就别使用,现在编译器已经很智能了,编译器知道该如何优化代码。对于我这样的普通人,知道这些关键字的含义,在看到Linux内核代码时,知道这些关键字修饰起什么作用就行了。
边栏推荐
猜你喜欢

Go language foundation ----- 03 ----- process control, function, value transfer, reference transfer, defer function

Go language foundation ------17 ----- channel creation, read-write, security shutdown, multiplexing select

技术干货|昇思MindSpore NLP模型迁移之Roberta ——情感分析任务

【MySQL 14】使用DBeaver工具远程备份及恢复MySQL数据库(Linux 环境)

研究显示乳腺癌细胞更容易在患者睡觉时进入血液

Technical dry goods | some thoughts on the future of AI architecture

Technology dry goods | Roberta of the migration of mindspore NLP model - emotion analysis task

Pat grade a 1027 colors in Mars

OSPF experiment

项目经验分享:实现一个昇思MindSpore 图层 IR 融合优化 pass
随机推荐
Go language foundation ----- 15 ----- reflection
[MySQL 13] if you change your password for the first time after installing mysql, you can skip MySQL password verification to log in
微软安全响应中心
Enter three times and guess a number
Static keyword
[Development Notes] cloud app control on device based on smart cloud 4G adapter gc211
输入三次猜一个数字
Technical dry goods | alphafold/ rosettafold open source reproduction (2) - alphafold process analysis and training Construction
【MySQL 11】怎么解决MySQL 8.0.18 大小写敏感问题
哪一刻你才发现青春结束了
Go language foundation ----- 18 ----- collaboration security, mutex lock, read-write lock, anonymous lock, sync Once
An article for you to understand - Manchester code
Traversal in Lucene
[at] ABC 258g - Triangle triples reachable - violence
基于RNA的新型癌症疗法介绍
Collector in ES (percentile / base)
Lucene hnsw merge optimization
PAT甲级 1027 Colors in Mars
PAT甲级 1030 Travel Plan
List exercises after class