• register关键字


    前言

    编译器的优化很大程度上就是通过数据流分析、调整读取内存的顺序等,减少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内核代码时,知道这些关键字修饰起什么作用就行了。

  • 相关阅读:
    忘记密码,如何解除Excel的限制保护?
    0递归中等 LeetCode306. 累加数
    System verilog从Testbench中dump出所需要的数据代码
    SQL语法之AND & OR 运算符
    类的生命周期
    centos7中安装Nginx和使用Nginx详细操作
    带你了解数据库的存储过程
    【mycat】mycat水平分表
    学校介绍静态HTML网页设计作品 DIV布局学校官网模板代码 DW大学网站制作成品下载 HTML5期末大作业
    Reflex WMS中阶系列9 - Pick Run之前预留托盘号给备货订单
  • 原文地址:https://blog.csdn.net/qq_51029592/article/details/125567401