C 选择结构的执行效率分析

代码汇编对比

● switch:跳转表直接定位分支

● if-else:依次逐个条件比较

核心差异:switch 计算偏移直接跳转;if-else 顺序依次判断

switch 反汇编底层原理(跳转表模式)

  1. 变量预处理 把字符 / 变量转为整型保存,减去最小 case 常量,算出相对偏移
    例:case 'A'(0x41)~'E',输入字符 - 'A',得到 0、1、2、3、4
  2. 范围校验 使用ja指令判断偏移是否超出最大跨度,超出直接跳到default
  3. 跳转表机制 O (1) 指令:jmp edx\*4 + 基地址
    ○ 跳转表:一块连续内存,存放每个 case 入口地址
    ○ 不管匹配哪个 case,核心指令步数固定,耗时几乎不变
    ○ 代价:占用额外内存存放跳转表
    ⚠️前提:case 值连续 / 近似连续,编译器才会生成跳转表;离散 case 不会生成跳转表,此时 switch 效率和 if-else 差不多

if-else 底层原理

  1. 顺序比较 O (n) 从第一个 if 开始,cmp + jne逐个判断,不命中就继续下一条
  2. 最坏情况:目标分支在最后,全部条件都要比较一遍
  3. 缺点:多次重复加载变量,分支越靠后,执行指令越多,耗时线性增加

总结

switch(生成跳转表时) if-else
跳转方式 计算偏移,查表跳转 顺序条件判断
时间复杂度 O(1) O(n)
适用场景 多分支、case 值连续(枚举 / ASCII) 分支少、case 数值离散
代价 占用额外内存(跳转表) 不额外占用空间

工程结论

  1. case 数量≥4,并且 case 数值连续 → 优先 switch,性能优势明显
  2. case 数值零散不连续 → 编译器不生成跳转表,switch 无性能优势
  3. 分支很少(2~3 个),if-else 和 switch 性能差距几乎感知不到
  4. 验证方式:Debug 模式看反汇编,确认是否生成跳转表

补充

● switch 不是天生就快,跳转表是编译器优化产物

● 字符 case 本质也是整型比较(用 ASCII 码),适合做 switch 跳转表优化

相关推荐
tellmewhoisi7 小时前
深度学习0:数学知识:正态分布1
人工智能·深度学习·算法
-梅7 小时前
算法(1) 动态规划
算法·动态规划
青少儿编程课堂7 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:Bellman-Ford与SPFA含负权最短路及负环检测全解析
c++·python·算法·bfs·信息学竞赛
j7~8 小时前
【C++ 八股文】(篇四)C++11 新特性
开发语言·c++·面试·c++11·八股文
eggwyw8 小时前
C++中大括号的用法合集
开发语言·c++
xiaoye-duck8 小时前
《C++ 项目:手写大模型接入 SDK》本地 Ollama 部署与适配
开发语言·网络·c++·语言模型
§ꦿCFོ༉9 小时前
嵌入式八股文—C语言入门学习(二)
c语言·学习·嵌入式·编程语言
联犀9 小时前
联犀 Go SIMD 实战:视频转码从 16.5ms 到 5.46ms
开发语言·golang·音视频
octopus_c9 小时前
STL 之 string:auto 与范围 for、常用接口、模拟实现与深浅拷贝
开发语言·c++·算法
Nerd(BUG版)9 小时前
KMP学习day5--Kotlin Flow异步流基础
开发语言·学习·kotlin