根据我的阅读,我可以总结一下,
if/elseif
(?)考虑一下我有 300 + 切换案例的情况。我知道这个场景中的if/elseif
会很乱。
但我想知道switch
案件的表现如何
这样的场景?
if/elseif
- switch
比较?我尝试使用.c
gcc 4.8.1
开关编译一个带有switch case的小-S
文件,它看起来像是一个跳转表。我从哪里开始?if/elseif
是更好/更差我主要对C / C ++特定细节感兴趣
答案 0 :(得分:23)
编译器可能决定使用跳转表,并在300 +的情况下进行大幅改进。
编译器会使用决策树等各种技术对分支进行优化。
编译器理解代码越容易越好。并且switch语句对于编译器来说也更具可读性。
从编译器的角度考虑其他问题。它看起来像一个箭头:
- if
- else
- else
- else
- else
您需要评估每个以前的if,以便找到正确的else。
然而,Switch看起来更像一个块:
- case
- case
- case
- case
因此,编译器有时可以确定直接去哪里。
关于你的子弹问题:
它是可扩展的。它很容易被开发人员编写,如果编译器使用跳转表,则会增加更多不会影响的案例。
由编译器来决定使用什么。它可能会选择根本不进行优化(但很可能是跳转表)。
你可以手动循环和安抚时间吗?
使用开关总是更好。在最糟糕的情况下,交换机将像if / else一样。
答案 1 :(得分:3)
大多数低端处理器(主要用于嵌入式系统)编译器的编译器并不总是为switch case生成跳转表。
如果案例变量是顺序的(例如1,2,3,4 ....)那么编译器首选跳转表实现切换案例,但对于案例变量的随机序列(例如12,344,565,1,5) ...)编译器生成与if-else代码生成的代码相同的代码。
有时候,由于开发人员在将OK随机案例变量添加到OK代码中时会遇到麻烦,因此可能会改变代码段的整个实现,从而导致代码执行时序和代码大小发生重大变化。这些是嵌入式开发人员最关心的问题。
答案 2 :(得分:2)
如果你选择很少,决策树很深,或者需要使用非特定的决策,那么if else比switch案例更好,
即。很容易实现一个if语句来检查int是否大于0,这更难以构建到switch语句中。这是使用if语句最好实现的逻辑类型。
如果您有一个扁平的,非常宽泛但具体的条件依赖决策表,那么切换案例会更好。例如,如果某个值为1,2,3,4 ...等到10时,您希望发生特定事情,那么使用开关案例会更容易和更准确。
最后,现代编译器会将其更改为最有效的计算方式,但是如何构建它会影响功能,并且一旦构建就会影响可支持性。
答案 3 :(得分:1)
从比较开关和if..then..else结构的问题来看,〜我假设你只是需要进行单一测试并且结果取决于答案的情况(例如,如果x = = ??然后......)。 在这种情况下使用开关总是更好,因为: a)你不能在测试链的一部分引入错误的条件。 b)测试只进行一次。