为什么说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.添加注释 注释能够增强代码的可读性以及可维护性,当然,理想情况是满满的注释,但这不太现实.所以我们只需要在一些关键的地方添上注释: 函数和方法:尤其是返回值,因为直接看不出来 大 ...
随机推荐
- jmeter服务器监控磁盘IO、网络-PerfMon Metrics Collector
1.jmeetr客户端安装jp@gc - PerfMon Metrics Collector 先安装jmeter-plugins 启动jmeter ——> 客户端选项 ——> jmeter ...
- odoo10甘特图gantt view
odoo10中的gantt图示例 1.Gantt属性说明 甘特图视图的根元素是<gantt />,它没有子节点但可以采用以下属性: date_start (required) 提供每条记录 ...
- 一些免费的API
Github 接口 Github 为我们提供了一些免费的 API 接口,利用这些接口我们可以开发一些工具. 接口文档地址为 https://docs.github.com/en/rest 下面是一个例 ...
- 使用镜像安装cygwin、gcc并配置CLion IDE -2020.09.12
使用镜像安装cygwin.gcc并配置CLion IDE -2020.09.12 Cygwin 官网:http://www.cygwin.com/ 下载64bit安装器,并打开选择next 尽量不要装 ...
- elasticsearch跨集群数据迁移
写这篇文章,主要是目前公司要把ES从2.4.1升级到最新版本7.8,不过现在是7.9了,官方的文档:https://www.elastic.co/guide/en/elasticsearch/refe ...
- 【原创】解BUG-xenomai内核与linux内核时间子系统之间存在漂移
版权声明:本文为本文为博主原创文章,转载请注明出处.如有问题,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 一.问题起源 何为漂移?举个例子两颗32.768kH ...
- PHP面试总结(转)
PHP面试总结 从8月15号来到北京一直到今天,一月有余.来的这段时间一直准备笔试面试,大大小小的公司,乱七八糟面了10多家,近期才安顿下来.面试的这段时间感觉自己成长了不少.初来到这个陌生的城市 ...
- 内存管理初始化源码2:setup_arch
PFN相关宏说明: /* kernel/include/linux/pfn.h */ PFN : Page Frame Number(物理页帧) /* * PFN_ALIGN:返回地址x所在那一页帧的 ...
- 面试官:哪些场景会产生OOM?怎么解决?
这个面试题是一个朋友在面试的时候碰到的,什么时候会抛出OutOfMemery异常呢?初看好像挺简单的,其实深究起来考察的是对整个JVM的了解,而且这个问题从网上可以翻到一些乱七八糟的答案,其实在总结下 ...
- bootsrap 样式笔记
颜色 --blue: #007bff; --indigo: #6610f2; --purple: #6f42c1; --pink: #e83e8c; --red: #dc3545; --orange: ...