Switch 底层执行原理

switch 底层执行原理

switch 语句根据一个整数索引值进行多重分支, 底层采用跳转表这种数据结构跳转表是一个数组, 表项 i 对应代码段的地址, 当 switch 索引值等于表项 i 时采取对应的程序操作

简单可理解为: 执行 switch 时生成一个长度为最大 case 常量+1 的数组, 程序首先判断 switch 变量是否大于最大 case 常量, 若大于, 则跳到 default 分支处理; 否则取得数组索引号为 switch 变量值大小, 取得数组对应值即为相应 case 代码块地址, 程序接着跳到此地址执行, 完成分支的跳转

但实际计算机底层实现这一操作会更加复杂一点, 以下参考深入理解操作机系统

图 a 是一个简单的 switch 例子, 对于 case 值有 100102~104106;case 值 102 与 104 是没有 break 语句结尾

图 b 是使用 C 语言的扩展形式来描述的, 每个表项都是一个代码块的地址 (指针), 这里的 && 指的就是 &

执行 switch 时, 会生成一张跳转表, 表项数为 (最大 case 值 - 最小 case 值+1), 跳转表是一个数组, 数组是一段连续的内存, jt 数组中包含了 7 个表项 (数组索引对应值), 每个都是指向对应代码块的指针

编译器将 switch 值 n - 最小 case 值 (100), 把取值范围移动到 0 至 6 之间, 创建出一个新的程序变量 index 首先判断 index 是否大于 6, 来判断是否在范围之外, 如果超出直接执行 default, 即 log_def 指针对应代码块

否则, 根据索引的值直接跳转不同位置

执行 if-else 是逐个条件进行判断, 直到命中; 与 if-else 语句相比, 使用跳转表的优点是执行 switch 语句的时间与数量无关, 且读取 switch 参数时只读取一次, 就可跳到对应分支; 缺点是维系了一个连续的数组, 实际时使用空间换时间

补充: 正因为要将 case 值转换为表项 i, 以及 switch 值要根据 case 值转换为对应数组索引, 所以 switch 入参时是不支持 bytefloatdouble 型, 以及对应 case 分支也是不支持 bytefloatdouble 型的

关于 switch 与 if-else 的简单优化

暂且不说 if-else 与 switch 相比哪一个的执行效率高, 先就知道原理后, 我们应如何去优化

if-else

对于 if-else, 在系统是自上而下逐个条件去判断, 直到命中; 所以应将机率大的条件置于最前面以下给出一个简单例子doublerandom=Math.random()*100;// 生成 0-100 的随机数

if(random>10){//90%

}elseif(random>5){//5%

}else{// 剩下的 5%

}

对于条件机率相等或是条件个数非常多的情况, 因为 switch 的执行时间与条件数量无关, 他是根据 switch 值直接跳转到对应分支, 所以可以选择 switch 代替 if-else

switch

对于 switch, 实际上是根据 case 最小值与最大值, 维系了一段连续的内存空间, 以空间换取时间以下给出一个简单的反例, 最大值与最小值跨度较大, 且之间没有更多的条件情况, 那个无疑实际申请的很多空间是没用的, 所以就应考虑使用 if-else 在代替intrandom=(int)Math.random()*100;// 生成 0-100 的随机数

switch(random){

case0:

break;

case100:

break;

}

深入操作机系统下载链接: http://download.csdn.net/download/abrazen_zz/9706844

来源: http://blog.csdn.net/abrazen_zz/article/details/79250450

C语言switch执行原理,Switch 底层执行原理相关推荐

  1. JVM17_Tomcat打破双亲委派机制、执行顺序、底层代码原理、Tomcat|JDBC破坏双亲委派机制带来的面试题

    文章目录 ①. Tomcat类加载机制 ②. Tomcat执行顺序 ③. ClassLoader的创建 ④. ClassLoader加载过程 ⑤. Tomcat破坏双亲委派机制带来的面试题 ①. To ...

  2. K8S 快速入门(四)Pod原理、核心组件工作原理

    一.Pod核心原理 1. Pod是什么? Pod的特点:封装docker容器的容器 1.有自己的IP地址 2.有自己的hostname Pod实际上也相当于是一个独立的容器(虚拟机器),而这个pod容 ...

  3. c语言case语句块,JavaScript使用Switch语句来选择将要执行的代码块

    JavaScript Switch 语句 switch 语句用于基于不同的条件来执行不同的动作. 使用 switch 语句来选择要执行的多个代码块之一.语法如下: switch(n) { case 1 ...

  4. 补充switch语句的内容和逗号运算符(C语言case后没有break的switch语句,会继续执行后面的语句再退出)

    补充switch语句的内容和逗号运算符 C语言case后没有break的switch语句,会继续执行后面的语句再退出 补充逗号运算符 C语言case后没有break的switch语句,会继续执行后面的 ...

  5. atitit.跨语言执行cmd cli api的原理及兼容性设计草案

    atitit.跨语言执行cmd cli api的原理及兼容性设计草案 1. 标准输入,标准输出,标准错误与重新定向1 2. 常见问题2 2.1. 执行bat文件2 2.2. 执行bat文件  /c   ...

  6. SQL底层执行原理详解

    我们平时都是使用sql语句去查询数据,都是很直接的看到结果.那么对于sql底层执行的过程大家有了解吗? 一.MySQL的内部组件结构 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分 ...

  7. 面试官:说说一条查询sql的执行流程和底层原理?

    作者:孤独烟,资深后端工程师,业内知名原创作者 一条查询SQL执行流程图如下 本文改编自<高性能Mysql>,烟哥用小说的形式来讲这个内容. 序章 自我介绍 我是一条sql,就是一条长长的 ...

  8. MySQL底层执行原理详解

    一.MySQL的内部组件结构 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分. 1.Server层 ​ 主要包括连接器.查询缓存.分析器.优化器.执行器等,涵盖 MySQL 的大多 ...

  9. c语言switch同时比较多个变量,C语言学习if和switch分支选择结构

    如何判断一个整数是否为正数 计算机同我们一样,也是可以判断大小.在此之前,我们需要先说明在计算机中用来判断两个数关系的符号,即关系运算符. 关系运算符号 c语言中的关系运算符与数学上学习的有什么不同? ...

最新文章

  1. 数据中心冷冻站模块化建设模式探讨
  2. Delphi中Indy 10的安装和老版本的卸载
  3. ASP.NET WebApi OWIN 实现 OAuth 2.0
  4. 文件不混淆_Android Studio配置反混淆
  5. 建立数组并写入数据_Visual Studio 2010--C#跟西门子1200通讯(Sharp7)⑥--数据写入
  6. ssl certificate 验证
  7. Compass样式重置
  8. asp网络编程:用ASP实现网页BBS
  9. 七牛云 转码_开发者选择短视频SDK,为何青睐七牛云?
  10. docker harbor 域名_docker 安装Harbor
  11. 台式计算机键盘驱动程序,电脑中使用驱动人生检测不到键盘驱动程序怎么解决...
  12. steam怎么设公用计算机,steam怎样设置家庭共享 steam家庭共享设置办法
  13. C# MES系统结构梳理
  14. 手机版wps怎么制作折线图_手机简历制作 | 微信怎么在线制作简历
  15. python template injection_月末总结(python模板注入)
  16. 博物馆沉浸式体验如何彰显文化价值
  17. el-rate的使用
  18. post模拟传数据的几种方法
  19. 新版Zotero插件更新
  20. Mysql中Page(页)和结构的认识

热门文章

  1. (随笔) 是我们眼界太狭隘了
  2. 【游戏逆向】某游戏球员价格列表分析
  3. android 语法分析方法,基于抽象语法树的Android应用相似度检测方法
  4. SaltStack介绍及安装
  5. 04Linux常用命令(文件系统与磁盘相关操作)
  6. Windows 入侵痕迹清理
  7. 2021年信息学部物联网工程学院学生科协第三次软件大培训(python)
  8. 产品经理如何基于需求迭代产品(上篇):需求调研的四个步骤
  9. 10 款实用的 CSS 开发助手推荐
  10. 【图神经网络】 - GNN的几个模型及论文解析(NN4G、GAT、GCN)