当前位置: 首页 > news >正文

switch语句导致程序跑飞,换成if-else就可以

最近在做一个项目,需要在SRAM中调用flash中已经烧好的函数,但是在跑的时候程序总是跑飞,找了半天居然是switch捣的鬼,换成if-else就没问题了。这还要从两者的底层逻辑来看。

在C语言的程序开发中,最常用的两种分支结构就是if-else条件语句switch多分支选择语句。二者都能实现“满足不同条件、执行不同代码”的功能。如下面两段代码

int grade = 2; switch (grade) { case 1: printf("一年级"); break; case 2: printf("二年级"); break; case 3: printf("三年级"); break; default: printf("未知年级"); }
int grade = 2; if (grade == 1) { printf("一年级"); } else if (grade == 2) { printf("二年级"); } else if (grade == 3) { printf("三年级"); } else { printf("未知年级"); }

一般认为当分支条件较多的时候,switch的执行效率是要更高的,根本原因是两者的执行机制完全不同:

1. if-else:暴力遍历,逐条判断

多分支if-else if-else从上到下顺序执行。假设你有 5 个分支,匹配的是最后一个条件:程序必须先白白计算、判断前面 4 个错误条件,全部走完,才会执行最后一个正确分支。分支越多,无效判断越多,速度越慢,耗时随分支数量线性增加。

2. switch:预建表格,精准跳转

switch 在编译代码的时候,编译器就提前干完了所有准备工作:把所有 case 的值和代码地址,整理成一张跳转表(索引表)。程序运行时只做一步:算出变量值 → 直接查表 →瞬间跳转到对应代码不需要遍历前面任何分支。无论你写 3 个分支还是 100 个分支,跳转耗时完全一样、恒定不变

出现的问题就是,如果flash中的函数中包含switch函数,在SRAM中执行,访问flash中的跳转表时出现错误。(这个问题跟CPU类型相关,arm一般不会出现这个问题,我所用的CPU的指令缓存只缓存指令,不缓存数据表,所以在SRAM中会跑飞,在flash中就不会有问题)。

此外还有一个问题,当 switch 很短(≤3~4 个 case),编译器不会生成跳转表,而是直接翻译成if-else语句。

http://www.jsqmd.com/news/1139753/

相关文章:

  • Java面试复习 Day 4
  • 豆包智能体说关就关!手把手教你手动抢救聊天记录,AI导出鸭搞定无损批量存档
  • ps查看 板端进程运行时间,显示的是 进程占cpu运行时间
  • OpenBoard完整教程:如何快速掌握这款免费交互式白板软件提升课堂效率
  • Guest Post外链指南:真实外链市场报价单与3招砍价技巧
  • 如何高效使用 Website-downloader 完整保存网站资源
  • 3步解决1-bit LLM部署难题:BitNet模型转换完整指南
  • Codex、Cursor、Kiro 不是一个东西:AI 编程工具该怎么分工?
  • Unity DOTS实战:ECS架构与Job System实现万级实体高性能仿真
  • 告别重复操作:3步打造你的鸣潮智能游戏管家
  • 图纸完美、装夹稳固,为何五轴零件仍会出现微米级错位?
  • 3步实战BitNet模型转换:从safetensors到高效推理的避坑指南
  • VSCode 中编码助手 Claude Code 平替插件:DeepCode
  • Three.js 火球效果教程
  • 如何用15MB开源应用让老旧安卓电视流畅播放4K直播:MyTV-Android技术解析与实战指南
  • STM32 IAP + Modbus 踩坑日记:四天四夜,腱鞘囊肿都犯了
  • 为什么需要中介者模式?
  • 如何快速上手:3步掌握Windows硬件信息修改工具
  • Mobile Security Framework MobSF技术深度解析与移动应用安全实战应用
  • 从零开始学习 ASP.NET MVC 1.0 (五) ViewEngine 深入解析与应用实例
  • 终极指南:黑苹果系统Intel无线网卡完整解决方案
  • 3步解锁BitNet模型转换:新手零代码部署完全指南
  • 2026年英文论文降AI用什么?Turnitin检测实测对比
  • Hermes Agent:本地化智能代理框架与国产化迁移实践
  • 网络安全渗透测试靶场实战指南:从零基础到高阶实战的完整学习路径
  • Terax:7MB轻量级AI原生开发环境全解析与实战指南
  • PetaLinux 2017.4 实操指南:PREEMPT_RT实时补丁移植+Zynq PL中断UIO用户态配置(超完整避坑版)
  • 2026 年 6 月 30 日 - 7 月 6 日全球主流大模型版本迭代与功能变动深度分析报告
  • Memory记忆机制
  • 可视挖耳勺新手入门推荐:可视耳勺好用吗?西圣、蜂鸟哪个好?