Switch 语句如何工作

2024-02-21

switch 语句如何立即下降到内存中的正确位置?对于嵌套的 if 语句,它必须与每个语句进行比较,但对于 switch 语句,它会直接转到正确的情况。这是如何实施的?


有很多不同的方法来编译switch语句转换成机器码。以下是一些:

  • The compiler can produce a series of tests, which is not so inefficient as only about log2(N) tests are enough to dispatch a value among N possible cases.

  • 编译器可以生成一个值和跳转地址表,通用查找代码(线性或二分法,类似于bsearch())最后跳转到对应的位置。

  • 如果 case 值足够密集,编译器可以生成跳转地址表和代码,用于检查 switch 值是否在包含所有 case 值的范围内,并直接跳转到相应的地址。这可能是最接近您的描述的实现:但使用 switch 语句它会直接转到正确的情况.

根据目标 CPU 的具体能力、编译器设置以及 case 值的数量和分布,编译器可能会使用上述方法之一或另一种方法,或者它们的组合,甚至一些其他方法。

编译器设计者花费了大量的精力来尝试改进这些选择的启发式方法。查看程序集输出或使用在线工具,例如Godbolt 的编译器资源管理器 https://godbolt.org/g/urU8Zu查看各种代码生成的可能性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Switch 语句如何工作 的相关文章

随机推荐

  • AngularJS Angular-File-Upload 未知提供者:$uploadProvider 错误

    这不是重复的这个问题 https stackoverflow com questions 24390170 unknown provider uploadprovider upload 我已将所有必需的文件包含在视图中 我的模块和控制器 v
  • jQuery 是否总是按照 DOM 在代码中出现的顺序迭代它们?

    举例来说 我有一个可排序列表 ul li Item 1 li li Item 2 li li Item 3 li ul 我想知道的是 如果我进行如下所示的 jQuery 调用 each li function key item 我可以期望
  • 为什么相对路径不适用于 xsl:include?

    我有一个 XSL 文件 它可以转换为 PDF 在这个页面的顶部 我有一个很长的 CSS 样式 例如
  • 来自应用程序的新 NSWindow - 不可能完成的任务?

    好吧 我做错了什么 1 创建了cocoa app和appDelegate 命名为 window2AppDelegate2 窗口AppDelegate h import PrefWindowController h interface win
  • 旋转图像和像素碰撞检测

    我这里有这个游戏plunker http plnkr co edit VCdFyn3SE4wSZa0OLRRT p preview 当剑不旋转时 一切正常 您可以通过取消注释第 221 行并注释掉第 222 223 行进行检查 当它们像上面
  • 如何在android中提取这个字符串变量?

    String test 1 Low level programming language true 2 High level programming language false 3 Machine language false 4 All
  • C中的时间戳,精度为毫秒

    我对 C 编程比较陌生 我正在开发一个需要非常精确的时间的项目 因此我尝试写一些东西来创建毫秒精度的时间戳 这似乎有效 但我的问题是这种方法是否正确 或者是否有更简单的方法 这是我的代码 include
  • xdebug 扩展未加载

    我已经安装了 xdebug 显示在 phpinfo 中 但我试图让它与 PHPUnit 的代码覆盖功能一起使用 它一直告诉我 XDebug 扩展未加载 我的 phpunit 与 WAMP 工作得很好 当我运行 php m 时 我没有看到 p
  • 无法在 C# 应用程序中为我的线程使用多个处理器组

    根据MSDN 文档 https msdn microsoft com en us library jj665638 v vs 110 aspx and 斯蒂芬 图布 回答 https social msdn microsoft com Fo
  • 如何保持 Asp.Net Core 控制器返回的 json 中属性的大小写?

    我们有一些遗留的 js 代码 它们执行 ajax 调用 并期望将属性命名为 Id Name 等 默认情况下 Asp Net Core 骆驼中的 json 序列化程序会使用返回实体上的属性 但我如何告诉它使用相同的大小写和 C 代码 最好我想
  • 如何在 MATLAB 中查找集合的中心点

    我正在尝试计算medoid http en wikipedia org wiki Medoid在MATLAB中 但是 我不知道该怎么做 我的数据集由多个三维数据点组成 因此具有三个轴的系统中的点云 中心点就是点 其与簇中所有其他对象的平均差
  • C# 应用程序中的全局鼠标钩子[重复]

    这个问题在这里已经有答案了 我想创建一个应用程序 当用户单击第三方 Windows 应用程序的指定按钮时 该应用程序将启动某些操作 我已经读过这里 C 应用程序中的全局鼠标捕获 https stackoverflow com questio
  • 使用 Perforce 代替 Subversion 有什么好处?

    我的团队使用 SVN 已有几年了 我们现在可以选择切换到 Perforce 做出这样的转变会有什么好处 和陷阱 P4 keeps track of your working copy on the server This means tha
  • 为什么事件冒泡在分离的 DOM 元素中不起作用?

    我有一个父母 div 有一个孩子 div 在内存中 未附加到当前文档 我想触发一个CustomEvent关注孩子 但听父母的事件 这是我的代码 var parent document createElement div var child
  • 在 Sublime Text 中添加自定义菜单

    如何添加自定义菜单项崇高文本2 有任何想法吗 我看到有一个主 sublime 菜单文件但不知道如何编辑它 Thanks sublime menu 文件只是 JSON 您可以在您的用户目录中创建一个 Main sublime menu 它将与
  • IOS 上的 PWA 和离线存储

    我们希望开发一款 应用程序 能够为评估人员记录受损汽车的详细信息 这个想法是让少数评估员拥有公司的 iPad 然后 当汽车损坏并返回车场时 他们可以参观拍照 输入一些详细信息 然后将其上传到主系统中 有些车场可能位于没有互联网覆盖的区域 因
  • 使用抽象超类作为Spring数据存储库的参数

    我知道如何实现 spring 数据存储库 创建一个像这样的界面 public interface CountryRepository extends CrudRepository
  • .on() 和 .click() 哪个更快?

    如果我有一个带有删除记录链接的表 那么连接单击事件的最佳方法是什么 这些在幕后的评价是否相同 table on click delete function do stuff or table delete click function do
  • 在 Twig 中使用自定义函数

    在我的模板中 我想输出服务器时区 我的模板有类似的东西 getservertimezone 然后在services yml我拥有的那个捆绑包的配置 my twig extension class My WebsiteBundle Exten
  • Switch 语句如何工作

    switch 语句如何立即下降到内存中的正确位置 对于嵌套的 if 语句 它必须与每个语句进行比较 但对于 switch 语句 它会直接转到正确的情况 这是如何实施的 有很多不同的方法来编译switch语句转换成机器码 以下是一些 The