if/else在什么阶段比开关盒更好?可以?

Suv*_*yil 21 c c++ performance switch-statement

据我所读,我可以总结一下,

  • Switch case是实现定义的,但主要定义为跳转表
  • Switch case使代码更具可读性
  • 开关比if/elseif(?)快

考虑一下我有300多个开关盒的情况.我知道if/elseif在这个场景中会是一团糟.

但我想知道switch案件在这样的场景中会如何表现?

  • 它是否具有可扩展性,即无论存在多少个案例,它仍然比if/else更快?
  • 由于它是实现定义的,我如何弄清楚我的编译器是如何实现它的?
  • 最重要的是我如何做到这一点if/elseif- switch除了实际编写代码和使用分析器之外的比较?我尝试.c使用gcc 4.8.1 -Sswitch来编译带有switch case 的小文件,它看起来像是一个跳转表.我从哪里开始?
  • if/elseif在这种情况下使用是更好/更糟

我主要对C/C++的具体细节感兴趣

Mic*_*CMS 23

编译器可能会决定使用跳转表,并在300+的情况下进行大幅改进.

编译器使用决策树等各种技术对分支进行优化.

编译器理解代码越容易越好.并且switch语句对于编译器来说也更具可读性.

从编译器的角度考虑其他问题.它看起来像一个箭头:

    - if 
     - else
      - else 
       - else
        - else
Run Code Online (Sandbox Code Playgroud)

您需要评估每个先前的if,以便找到正确的else.

但是,Switch看起来更像一个块:

     - case
     - case
     - case
     - case
Run Code Online (Sandbox Code Playgroud)

因此,编译器有时可以确定直接去哪里.

对于你的子弹问题:

  1. 它是可扩展的.它很容易被开发人员编写,如果编译器使用跳转表,添加更多的情况不会影响.

  2. 由编译器决定使用什么.它可能会选择根本不优化它(但很可能是跳转表).

  3. 您可以手动运行循环和安抚时间吗?

  4. 使用开关总是更好.在最坏的情况下,交换机将像if/else一样运行.

  • "使用开关总是更好." 在表现中,是的.在可读性和程序员错误的可能性,没有. (3认同)

Vag*_*ish 5

大多数低端处理器(主要用于嵌入式系统)的编译器并不总是为 switch case 生成跳转表。

如果 case 变量按顺序排列(例如 1,2,3,4...),则编译器首选 switch case 的跳转表实现,但对于 case 变量的随机序列(例如 12,344,565,1,5...) ) 编译器生成与 if-else 代码相同的代码。

有时,由于这个原因,开发人员在向已经正常的代码中添加随机 case 变量时会遇到麻烦,可能会更改该代码段的整个实现,从而导致代码执行时间和代码大小发生重大变化。这些是嵌入式开发人员最关心的问题。

  • @EJP 为什么这是不真实的?我在我的一个项目中遇到过这个问题。我并不是说这是所有编译器的行为。如果我遗漏了什么,请向我解释你的观点。 (2认同)