繁体   English   中英

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

[英]At what stage does an if/else become better than a switch case? Does it?

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

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

考虑一下我有300多个开关盒的情况。 我知道这个场景中的if/elseif会很乱。

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

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

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

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

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

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

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

    - if 
     - else
      - else 
       - else
        - else

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

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

     - case
     - case
     - case
     - case

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

对于你的子弹问题:

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

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

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

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

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

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

有时候,由于这个开发人员在将随机案例变量添加到已经存在的代码中时遇到了麻烦,可能会改变代码段的整个实现,这可能导致代码执行时序和代码大小的重大变化。 这些是嵌入式开发人员最关心的问题。

如果您没有多少选择,使用深度决策树或需要使用非特定决策,那么if else优于switch案例,

即。 很容易实现一个if语句来检查int是否大于0,这更难以构建到switch语句中。 这是使用if语句最好实现的逻辑类型。

如果您有一个扁平的,非常宽泛但具体的条件依赖决策表,那么切换情况会更好。 例如,如果值为1,2,3,4 ...等到10,您希望发生特定事情,使用开关案例会更容易和更准确。

最后,现代编译器会将其更改为最有效的计算方式,但是如何构建它将影响功能,并在构建它后提供可支持性。

从将开关与if..then..else构造进行比较的问题来看,〜我假设你只是需要进行单一测试并且结果取决于答案的情况(例如,如果x == ??然后 ...)。 在这种情况下使用开关总是更好,因为:a)你不能在测试链的一部分引入错误的条件。 b)测试只进行一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM