register关键字详解

2023-05-16

前言:

编译器的优化很大程度上就是通过数据流分析、调整读取内存的顺序等,减少CPU对内存的读写。因为内存的运行速度相对于CPU是很慢的,计算机中添加cache就是为了解决CPU和内存运行速度差异过大的问题。就运行速度来说:寄存器>cache>内存>外存;就价格来说刚好相反:寄存器>cache>内存>外存。这也是寄存器和cache的读取速度最快,但是计算机中寄存器和cache的容量却很小的原因, 你可以买到1T的硬盘但是没买不到1T的内存条,价格太高,有也买不起。寄存器的数量和功能在Soc中是固定的,后期没法扩展,寄存器资源是稀缺的,对寄存器的操作要谨慎。

register关键字的作用

用register关键字修饰变量,就是编译程序时希望把该变量放到寄存器中,这样可以提高对该变量的访问速度。由前言可知,CPU访问寄存器的速度是高于访问内存的速度。

register关键字的应用场景

当一个变量会被频繁调用时,可以用register去修饰变量,将变量保存在寄存器中,可以提升访问变量的速度。

register关键字的注意事项

register int abc = 0printf("&abc=%p\n", &abc);

1.register变量必须是能被CPU所接受的类型。变量保存在寄存器中,那表示变量的程度不能超过寄存器的位数并且类型要和寄存器接受的数据类型一致。通常情况register修饰的变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。如果寄存器允许存放浮点数,那register修饰的变量也可以是浮点数。
2.因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址用register修饰的变量是不一定会存放在寄存器中的,用register修饰只是建议将该变量保存到寄存器,并不是强制性的。至于为什么不能用"&"来取地址我是有疑问的,ARM是统一编址,寄存器和内存一样都是通过地址访问,在访问方式上来说,寄存器和内存是一样的。用register修饰的变量不存放在内存来解释不能用“&”来获取register变量的地址,我不理解,有知道原因的大佬欢迎指教。不过确实不能用“&”来获取register变量的地址,原因是编译通不过。上面的代码在编译时会报错:
error: address of register variable ‘abc’ requested
3.局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c。我猜测原因是:静态变量的生命周期和整个程序的生命周期是一样的,总不能分配一个寄存器一直被一个变量占用,寄存器资源是很宝贵的,这样太浪费。
4.不能定义任意多个寄存器变量,原因很简单Soc的寄存器太少了。就算你用register修饰都不一定会放在寄存器中,更别说还要定义多个。个人觉得,这些特殊的关键字,没十足的把握就别使用,现在编译器已经很智能了,编译器知道该如何优化代码。对于我这样的普通人,知道这些关键字的含义,在看到Linux内核代码时,知道这些关键字修饰起什么作用就行了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

register关键字详解 的相关文章

  • centos 安装oraclejdk8

    1 下载安装包 xff0c 需要登录之后才能下载文件 https www oracle com java technologies javase javase8 archive downloads html 2 卸载虚拟机自带的JDK rp
  • 像素密度计算

    为解决Android设备碎片化 xff0c 引入一个概念density xff0c 也就是密度 它指的是在一定尺寸的物理屏幕上显示像素的数量 一般使用dpi dots per inch 每英寸像素数 作为单位 比如设备分辨率为240x320
  • FixedThreadPool 使用方法测试

    public class testFixedThreadPool 固定大小的线程池 同时可以处理 参数 个任务 xff0c 多余的任务会排队 xff0c 当处理完一个马上就会去接着处理排队中的任务 Callable的任务在后面的blog有更
  • 【机器学习】西瓜书_周志华,习题集6.2,使用LIBSVM在西瓜数据集3.0a上分别用线性核和高斯核训练一个SVM,并比较其支持向量的差别。

    机器学习 西瓜书 周志华 xff0c 习题集6 2 xff0c 使用LIBSVM在西瓜数据集3 0a上分别用线性核和高斯核训练一个SVM xff0c 并比较其支持向量的差别 参考资料 xff1a LibSVM xff1a https www
  • python库pydot运行出现:FileNotFoundError:“dot.exe” not found in path

    源代码参考 此博客 xff0c 运行在win10系统下 在最后一行输出pdf文件出了如下bug graph 0 write pdf 34 iris pdf 34 解决方法 xff1a 先确认已经安装Graphviz xff0c 安装过程不赘
  • 关于char类型转换为int类型

    package HomeWork import java util Scanner public class Demo10 public static void main String args String a 61 new Scanne
  • Micapipe:一个用于多模态神经成像和连接组分析的管道

    摘要 多模态磁共振成像 xff08 MRI xff09 通过促进对大脑跨多尺度和活体大脑的微结构 几何结构 功能和连接组的分析 xff0c 加速了人类神经科学 然而 xff0c 多模态神经成像的丰富性和复杂性要求使用处理方法来整合跨模态的信
  • 电脑设置ftp共享文件的方法

    1 首先打开控制面板 xff0c 找到程序 打开或关闭Windows功能选项 2 找到internet信息服务项把其下面的所有子功能全部勾选 3 等待短时间服务配置完成后 xff0c 右键我的电脑打开管理 xff0c 选择internet信
  • C#窗体控件--button

    本文介绍C 窗体控件的 button 该控件是窗体中实现按钮点动 xff0c 触发事件则由程序逻辑进行 操作流程 1 1 添加控件 新建一个窗体 xff0c 在界面中添加Button控件如下所示 xff1a 1 2 控件属性设置 设置控件的
  • Android APK资源加载流程

    概述 我们在Activity中访问资源 xff08 图片 xff0c 字符串 xff0c 颜色等 xff09 是非常方便的 xff0c 只需要getResources 获取一个Resources对象 xff0c 然后就可以访问各种资源了 x
  • 倍福位置记忆--TwinCAT对绝对值编码器溢出圈数的处理--以汇川IS620N为例

    首先配置伺服 xff0c 如下所示 xff1a 根据伺服手册和编码器反馈的数值可知 xff0c 其每转脉冲数 xff0c 和最大的记忆圈数 xff1a 型号 xff1a IS620N 编码器位数 xff1a 8388608 最大 xff1a
  • 【LeetCode 】160. 相交链表(高频!字节面试题 双指针法 Python 7行代码 中学追及问题)

    1 题目描述 编写一个程序 xff0c 找到两个单链表相交的起始节点 如下面的两个链表 xff1a 在节点 c1 开始相交 示例 1 xff1a 输入 xff1a intersectVal span class token operator
  • Android中Paint字体的灵活使用

    在Android开发中 xff0c Paint是一个非常重要的绘图工具 xff0c 可以用于在控制台应用程序或Java GUI应用程序中绘制各种形状和图案 其中 xff0c Paint setText 方法是用于设置Paint绘制的文本内容
  • HTML5字体集合的实践经验

    随着互联网的发展 xff0c 网站已成为人们获取信息和交流的重要平台 而一个好的网站 xff0c 不仅需要有美观的界面 xff0c 还需要有良好的用户体验 其中 xff0c 字体是影响用户体验的一个重要因素 下面就让我们来看看HTML字体集
  • 20220806 美团笔试五道编程题(附AK题解)

    恭喜发现宝藏 xff01 微信搜索公众号 TechGuide 回复公司名 xff0c 解锁更多新鲜好文和互联网大厂的笔经面经 作者 64 TechGuide 全网同名 点赞再看 xff0c 养成习惯 xff0c 您动动手指对原创作者意义非凡
  • css中样式类型及属性值的获取

    前言 以前真的没怎么重视 xff0c 然后突然就遇到了与之相关的一个问题 xff0c 最后百度解决了这个问题 xff0c 因此简单记录一下 css样式类型 css样式主要分为三种类型 xff1a 1 内联样式 xff08 行内样式 xff0
  • Ubuntu 18.04版本设置root账户

    Linux系统下文件的权限十分重要 xff0c 大多数操作都需要一定的权限才可以操作 xff0c Ubuntu18 04默认安装是没有设置root账户的 xff0c 因此想要获得root账户登录可以使用以下步骤 xff1a 1 首先获得临时
  • Content-Type: application/vnd.ms-excel 操作文件

    如果要将查询结果导出到Excel xff0c 只需将页面的Context Type修改一下就可以了 xff1a header Content Type application vnd ms excel gt 如果希望能够提供那个打开 保存的
  • win7重装的坑:启动分区不存在 使用分区工具修正

    其实安装win7几个步骤 xff1a 制作启动硬盘 xff08 先制作启动盘 xff0c 再将下载好的ios镜像文件放入 xff09 使用一键安装工具安装系统修改引导启动项 原来的系统盘上面会有原来的主引导文件 xff08 MBR MSR格
  • IN和EXISTS的区别和使用

    一 结论 in 适合子表比主表数据小的情况 exists 适合子表比主表数据大的情况 当主表数据与子表数据一样大时 in与exists效率差不多 可任选一个使用 二 区别 2 1 in的性能分析 select from A where id

随机推荐

  • Android自定义ViewGroup交互进阶,右滑进入详情

    自定义Viewgroup右滑进入详情 前言 在之前的 ViewGroup 的事件相关一文中 xff0c 我们详细的讲解了一些常见的 ViewGroup 需要处理的事件与运动的方式 我们了解了如何处理拦截事件 xff0c 如何滚动 xff0c
  • spring事务实现的几种方式

    一 前言 1 事务几种实现方式 xff08 1 xff09 编程式事务管理对基于 POJO 的应用来说是唯一选择 我们需要在代码中调用beginTransaction commit rollback 等事务管理相关的方法 xff0c 这就是
  • Java实现通过正则表达式判断一个字符串是否含有指定字符

    场景 1 校验一个字符串是否包含有指定字符 这个很简单 xff0c 就单纯的用indexOf或者Contains方法实现就可以了 2 校验一个字符串是否包含的特殊字符 特殊字符虽有多个但也只有几个 xff0c 双重for循环套用indexO
  • springboot使用@SpringBootTest注解进行单元测试

    一 示例 1 1 添加依赖 span class token prolog lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt span span class token tag s
  • 比较两个List是否相等

    1 直接使用equals 比较 众所周知 xff0c 两个列表具有完全相同的元素并且具有完全相同的顺序时 xff0c 它们是相等的 因此 xff0c 如果我们业务要求两个list顺序一致 xff0c 可以使用equals xff08 xff
  • JVM-StringTable(三)

    一 常量池与串池StringTable的关系 span class token keyword public span span class token keyword class span span class token class n
  • SpringBoot常用拦截器(HandlerInterceptor,ClientHttpRequestInterceptor,RequestInterceptor)

    一 SpringBoot常用拦截器 下面3种拦截器 xff0c 都是http拦截器 xff0c 在处理业务逻辑之前对http请求信息进行处理 xff0c 比如获取请求头 xff0c 请求参数 xff0c 设置请求头 xff0c 请求参数等等
  • JAVA多线程基础篇-join方法的使用

    一 概述 join 是Thread类中的一个方法 xff0c 它的作用是将当前线程挂起 xff0c 等待其他线程结束后再执行当前线程 xff0c 即当前线程等待另一个调用join 方法的线程执行结束后再往下执行 通常用于在main主线程内
  • BindingException:Invalid bound statement (not found)异常

    一 前言 本文的mybatis是与springboot整合时出现的异常 xff0c 若使用的不是基于springboot xff0c 解决思路也大体一样的 二 从整合mybatis的三个步骤排查问题 但在这之前 xff0c 我们先要知道整合
  • SQL中case when用法详解及使用案例

    一 语法 Case具有两种格式 简单Case函数和Case搜索函数 简单Case函数格式 xff1a CASE 列名 WHEN 条件值1 THEN 选项1 WHEN 条件值2 THEN 选项2 ELSE 默认值 END Case搜索函数 x
  • 想入行C++游戏脚本制作?首先听听7年经验大佬怎么说?

    先自我介绍一下 xff0c 七年的程序开发经验 xff0c 在小一线城市税后2W多点 xff0c 本应过着很舒适的生活 xff0c 每天喝点小酒 xff0c 玩玩游戏 但自从入了A股 xff0c 一切都改变了 xff0c 如今的我 xff0
  • 大学刚毕业,用10000小时,走进字节跳动拿了offer

    前言 xff1a 没有绝对的天才 xff0c 只有持续不断的付出 对于我们每一个平凡人来说 xff0c 改变命运只能依靠努力 43 幸运 xff0c 但如果你不够幸运 xff0c 那就只能拉高努力的占比 2020年7月 xff0c 我有幸成
  • tensorflow中tfrecord数据操作

    前言 xff1a 为了更加展示tfrecord数据的相关操作 xff0c 笔者后续又写了一个实践的简单例子进一步解释 xff0c 具体可以看 xff1a TFrecords 制作数据集小例子 xff08 多标签 xff09 爱吃火锅的博客
  • 软件测试阶段

  • VR技术类毕业论文文献有哪些?

    本文是为大家整理的VR技术主题相关的10篇毕业论文文献 xff0c 包括5篇期刊论文和5篇学位论文 xff0c 为VR技术选题相关人员撰写毕业论文提供参考 1 期刊论文 运动炫科技 智慧赢未来 VR技术在体育领域内的应用与展望 期刊 xff
  • CentOS7防火墙添加端口

    CentOS7防火墙添加端口 CentOS防火墻添加端口比较简单 xff0c 三步走 xff08 皆以root用户执行 xff0c 或者用sudo命令 xff09 xff1a 1 查看开发的端口 firewall span class to
  • 手写一个--生产者消费者模式

    文章目录 前言wait notify方法实现生产者消费者模型1 使用Object的wait notify 方法2 使用Lock和Condition的await signal 方法3 使用BlockingQueue阻塞队列方法 前言 生产者消
  • C语言中static关键字用法和作用

    static修饰的对象 xff1a static关键字可以修饰 xff1a 局部变量 全局变量 函数 static修饰后改变了什么 xff1f 1 改变了生存周期 xff1b 就是一个变量 函数从分配内存去表示到回收内存的过程 2 改变了作
  • c语言中NULL到底是什么?

    C语言中NULL到底是什么 xff1f 1 NULL在C C 43 43 中定义为 xff1a ifdef cplusplus 定义这个符号就表示当前是C 43 43 环境 define NULL 0 在C 43 43 中NULL就是0 e
  • register关键字详解

    前言 xff1a 编译器的优化很大程度上就是通过数据流分析 调整读取内存的顺序等 xff0c 减少CPU对内存的读写 因为内存的运行速度相对于CPU是很慢的 xff0c 计算机中添加cache就是为了解决CPU和内存运行速度差异过大的问题