C语言switch执行原理,Switch 底层执行原理
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 底层执行原理相关推荐
- JVM17_Tomcat打破双亲委派机制、执行顺序、底层代码原理、Tomcat|JDBC破坏双亲委派机制带来的面试题
文章目录 ①. Tomcat类加载机制 ②. Tomcat执行顺序 ③. ClassLoader的创建 ④. ClassLoader加载过程 ⑤. Tomcat破坏双亲委派机制带来的面试题 ①. To ...
- K8S 快速入门(四)Pod原理、核心组件工作原理
一.Pod核心原理 1. Pod是什么? Pod的特点:封装docker容器的容器 1.有自己的IP地址 2.有自己的hostname Pod实际上也相当于是一个独立的容器(虚拟机器),而这个pod容 ...
- c语言case语句块,JavaScript使用Switch语句来选择将要执行的代码块
JavaScript Switch 语句 switch 语句用于基于不同的条件来执行不同的动作. 使用 switch 语句来选择要执行的多个代码块之一.语法如下: switch(n) { case 1 ...
- 补充switch语句的内容和逗号运算符(C语言case后没有break的switch语句,会继续执行后面的语句再退出)
补充switch语句的内容和逗号运算符 C语言case后没有break的switch语句,会继续执行后面的语句再退出 补充逗号运算符 C语言case后没有break的switch语句,会继续执行后面的 ...
- atitit.跨语言执行cmd cli api的原理及兼容性设计草案
atitit.跨语言执行cmd cli api的原理及兼容性设计草案 1. 标准输入,标准输出,标准错误与重新定向1 2. 常见问题2 2.1. 执行bat文件2 2.2. 执行bat文件 /c ...
- SQL底层执行原理详解
我们平时都是使用sql语句去查询数据,都是很直接的看到结果.那么对于sql底层执行的过程大家有了解吗? 一.MySQL的内部组件结构 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分 ...
- 面试官:说说一条查询sql的执行流程和底层原理?
作者:孤独烟,资深后端工程师,业内知名原创作者 一条查询SQL执行流程图如下 本文改编自<高性能Mysql>,烟哥用小说的形式来讲这个内容. 序章 自我介绍 我是一条sql,就是一条长长的 ...
- MySQL底层执行原理详解
一.MySQL的内部组件结构 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分. 1.Server层 主要包括连接器.查询缓存.分析器.优化器.执行器等,涵盖 MySQL 的大多 ...
- c语言switch同时比较多个变量,C语言学习if和switch分支选择结构
如何判断一个整数是否为正数 计算机同我们一样,也是可以判断大小.在此之前,我们需要先说明在计算机中用来判断两个数关系的符号,即关系运算符. 关系运算符号 c语言中的关系运算符与数学上学习的有什么不同? ...
最新文章
- 数据中心冷冻站模块化建设模式探讨
- Delphi中Indy 10的安装和老版本的卸载
- ASP.NET WebApi OWIN 实现 OAuth 2.0
- 文件不混淆_Android Studio配置反混淆
- 建立数组并写入数据_Visual Studio 2010--C#跟西门子1200通讯(Sharp7)⑥--数据写入
- ssl certificate 验证
- Compass样式重置
- asp网络编程:用ASP实现网页BBS
- 七牛云 转码_开发者选择短视频SDK,为何青睐七牛云?
- docker harbor 域名_docker 安装Harbor
- 台式计算机键盘驱动程序,电脑中使用驱动人生检测不到键盘驱动程序怎么解决...
- steam怎么设公用计算机,steam怎样设置家庭共享 steam家庭共享设置办法
- C# MES系统结构梳理
- 手机版wps怎么制作折线图_手机简历制作 | 微信怎么在线制作简历
- python template injection_月末总结(python模板注入)
- 博物馆沉浸式体验如何彰显文化价值
- el-rate的使用
- post模拟传数据的几种方法
- 新版Zotero插件更新
- Mysql中Page(页)和结构的认识