为什么说switch比if快
C++的switch语法
在C++中,switch只接受整型常量作为分支的值:
switch (expr) {
case integral-constant :
\\...
break;
case integral-constant :
\\...
break;
default :
\\...
break;
}
这里有几个需要注意的细节:
- 最好将default分支写出来,即使什么也不做
- 若分支没有写break语句,那么最好注释为什么这么做
- 若要在switch内定义变量需要创建一个作用域{},否则从语法上就可以跳过变量的初始化而直接使用变量,这样是不合理的所以编译会直接报错
switch的实现原理
switch的实现利用了跳转表这一数据结构,其实就是一个保存各个分支代码入口地址的数组。与一连串的if/else相比,跳转表的优点就是确定分支代码的时间和分支数量无关,是一个常数。
编译器会根据switch的分支数量以及分支对应的值的稀疏程度来决定如何翻译代码。当分支数量较多且值相对集中的时候就会采用跳转表来实现。
//原版C++代码
int ans = 0;
switch (n) {
case 100 :
ans = 0;
break;
case 102 :
ans = 2;
//fall through
case 103 :
ans = 3;
break;
case 104 :
//fall through
case 106 :
ans = 6;
break;
default :
ans = 0;
}
return ans;
//翻译为跳转表的C++代码
//跳转表
static void *jt[7] = {
&&loc_A, &&loc_def, &&loc_B,
&&loc_C, &&loc_D, &&loc_def,
&&loc_D
};
//对分支对应的值做简单的坐标变换
unsigned index = n - 100;
int ans = 0;
//default分支
if (index > 6) {
goto def;
}
//进行分支跳转
goto &jt[index];
//case 100
loc_A :
ans = 0;
goto done;
//case 102
loc_B :
ans = 2;
//fall through
loc_C :
ans = 3;
goto done;
//case 104 106
loc_D :
ans = 6;
goto done;
loc_def :
ans = 0;
done :
return ans;
- 素材来自«深入理解计算机系统»
为什么说switch比if快的更多相关文章
- java中if和switch哪个效率快
首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断:而 switch 只能对基本类型进行数值比较.两者的可比性就仅限在两个基本类型比较的范围内.说到基本类型 ...
- PHP switch的“高级”用法详解
只所以称为“高级”用法,是因为我连switch的最基础的用法都还没有掌握,so,接下来讲的其实还是它的基础用法! switch 语句和具有同样表达式的一系列的 IF 语句相似.很多场合下需要把同一个变 ...
- Switch分销技术解读
Switch分销技术解读 来源:环球旅讯|2009-03-13 当Switch在海外成熟运作近40年后,该业务终于进入中国市场.但对于中国业者来说,知道Switch的人很少,了解Switch的人更少. ...
- php中switch与ifelse的效率分析
1.当被判断的值是常量(固定不变的值)时,switch的运行效率比ifelse的运行效率高: $jiejie=3; // 变判断的值为常量 switch($jiejie){ case 1: ...
- PHP丨PHP基础知识之条件语SWITCH判断「理论篇」
Switch在一些计算机语言中是保留字,其作用大多情况下是进行判断选择.以PHP来说,switch(开关语句)常和case break default一起使用 典型结构 switch($control ...
- js-JavaScript高级程序设计学习笔记21 改善JavaScript性能的方法
第24章 最佳实践 1.性能 1.避免全局查找 将在一个函数中会用到多次的全局对象保存在局部变量.比如多次使用document.getElement...,可以首先var doc=document,把 ...
- 【原】javascript最佳实践
摘要:这篇文章主要内容的来源是<javascript高级程序设计第三版>,因为第二遍读完,按照书里面的规范,发觉自己在工作中没有好好遵守.所以此文也是对自己书写js的一种矫正. 1.可维护 ...
- js024-最佳实践
js024-最佳实践 本章内容: 可维护的代码 保证代码性能 部署代码 24.1 可维护性 24.1.1 代码的可维护性 代码可维护性的特征: 特性 说明 可理解性 其他人可以理解它的用途和一般途径 ...
- JS学习笔记12_优化
一.可维护性优化 1.添加注释 注释能够增强代码的可读性以及可维护性,当然,理想情况是满满的注释,但这不太现实.所以我们只需要在一些关键的地方添上注释: 函数和方法:尤其是返回值,因为直接看不出来 大 ...
随机推荐
- fabric1.4 网络操作
建立第一个网络 进入对应目录 $ cd fabric-samples/first-network 在first-network目录下有两个自动化脚本byfn.sh和eyfn.sh, 这两个脚本的启动顺 ...
- vueJs 安装
1.下载nodeJs 可前往 https://www.cnblogs.com/takeyblogs/p/13600124.html 这里下载 2.由于 npm 安装速度慢,本教程使用了淘宝的镜像及其命 ...
- 学会使用BeanUtils,提高你的开发效率
一.关于BeanUtils 一说到BeanUtils,大家可能不清楚指的哪个BeanUtils.因为它在很多包里面都有,其中挺常用的就是 (1)org.apache.commons.beanutils ...
- adb安装apk包提示protocol failure问题
截图来自CSDN,待验证
- 万字详解TDengine 2.0整体架构设计思路
导读:涛思数据8月3日将TDengine 的集群功能开源,TDengine具有超强的性能和功能,为什么能做到?它到底有哪些技术创新?今将TDengine的整体设计文档分享出来. 1: 数据模型 物联 ...
- 2020华为杯数学建模B题-RON建模 赛后总结与分析
好久好久没有写博客了...挺累的,从二月份开始找暑期实习,接着在进行暑期实习,然后马不停蹄地进行秋招,现在总算结束实习,前两天又参加了华为杯数学建模竞赛,感觉接下来就会很轻松了,希望能好好休息休息.这 ...
- vulnhub-Os-hackNos-2
vulnhub-Os-hackNos-2 开局扫主机,发现141是存活的,进行nmap扫描,获取端口信息. 发现22,80端口开放,进行目录爆破. 发现tsweb,浏览器访问,推测是wordpress ...
- Python3.8下载安装步骤及环境变量配置详解
安装地址:https://www.python.org/ 打开python官网网址,点击 Python 3.8.5 3.下载与自己电脑系统相匹配的版本(这里以64为例) 点击下载完成后打开文件运行 点 ...
- tf.app.flags与argparse功能类似
https://blog.csdn.net/ei1990/article/details/76423277 tensorflow中tf.app.flags与argparse模块有点类似,通过它们都可以 ...
- java 判断jsonObject 对象为null的天坑问题
jsonObject = {"mmbRetrieveBookingResponse":{"bookingData":null,"isAfterTran ...