![]() |
1
147
使用开关。 在最坏的情况下,编译器将生成与if-else链相同的代码,因此不会丢失任何东西。如果有疑问,请将最常见的情况放在switch语句中。 在最好的情况下,优化器可能会找到一种更好的方法来生成代码。编译器通常做的事情是构建一个二进制决策树(在一般情况下保存比较和跳转),或者简单地构建一个跳转表(完全不进行比较)。 |
![]() |
2
42
对于您在示例中提供的特殊情况,最清晰的代码可能是:
显然,这只是将问题转移到代码的另一个区域,但是现在您有机会重用这个测试。你还有更多的选择来解决它。您可以使用std::set,例如:
我不是说这是RequiresSpecialEvent的最佳实现,只是说这是一个选项。您仍然可以使用开关或者if-else链,或者查找表,或者对值进行一些位操作,无论什么。你的决策过程越模糊,你在一个孤立的函数中得到的价值就越大。 |
![]() |
3
19
开关 是 更快。 只需尝试在一个循环中使用if/else 30个不同的值,并使用switch将其与相同的代码进行比较,以了解switch的速度有多快。 现在, 开关有一个真正的问题 :开关必须在编译时知道每种情况下的值。这意味着以下代码:
不会编译。 大多数人将使用定义(aargh!)和其他人将在同一编译单元中声明和定义常量变量。例如:
因此,最后,开发人员必须在“速度+清晰度”和“代码耦合”之间进行选择。 (不是说一个开关不能写得像地狱一样混乱……我现在看到的大多数开关都属于这种“混乱”类别…但这是另一个故事…)
.
|
![]() |
4
18
编译器会对它进行优化,因为它是最可读的。 |
![]() |
5
6
开关,如果只是为了可读性。巨人如果声明是难以维持和难以阅读在我看来。 Error 01 ://故意摔倒 或 (错误_01==numeror)|| 后者更容易出错,并且比前者需要更多的类型和格式。 |
![]() |
6
5
可读性代码。如果您想知道什么性能更好,可以使用分析器,因为优化和编译器各不相同,性能问题很少出现在人们认为的地方。 |
![]() |
7
5
使用开关,它是为程序员所期望的。
我会把多余的箱子标签放进去——只是为了让人们感觉舒服,我试着记住什么时候/什么时候把它们放在外面的规则。
|
![]() |
8
3
编译器非常擅长优化
我做了一些测试 godbolt .
当
例如,GCC 5.2-O3编译了
请注意,位图是即时数据,因此访问它或跳转表时不会有潜在的数据缓存丢失。
GCC 4.9.2-O3汇编了
注意它是如何从中减去1的
较短的(机器代码)序列为:
(未使用
从
Agner Fog's instruction tables
,变量计数移位指令比
|
![]() |
9
2
在我看来,这是一个完美的例子,说明什么是开关掉下来的原因。 |
![]() |
10
1
如果您的案例在将来很可能保持分组(如果多个案例对应一个结果),那么这个切换可能会更容易阅读和维护。 |
![]() |
11
1
他们工作得同样好。现代编译器的性能基本相同。 相对于case语句,我更喜欢if语句,因为它们更可读、更灵活——您可以添加其他不基于数字相等的条件,如“max<min”。但是对于你在这里发布的这个简单的案例,这并不重要,只要做你最容易阅读的事情就行了。 |
![]() |
12
1
首选开关。查看交换机的案例列表比读取长if条件更容易,更容易确定它在做什么。
复制在
我通常更喜欢使用多态性而不是开关,但是如果没有上下文的更多细节,就很难说了。 至于性能,您最好的选择是使用分析器来测量应用程序在类似于您在野外所期望的条件下的性能。否则,您可能会在错误的位置以错误的方式进行优化。 |
![]() |
13
1
我同意交换解决方案的复杂性,但我认为
劫持开关
在这里。
|
![]() |
14
1
我不确定最佳实践,但我会使用开关-然后通过“默认”陷阱故意摔倒。 |
![]() |
15
1
在美学上,我倾向于这种方法。
让数据更智能一点,这样我们就能让逻辑更模糊一点。 我知道这看起来很奇怪。以下是我在python中的灵感:
|
![]() |
16
1
可能第一个循环是由编译器优化的,这就解释了为什么第二个循环在增加循环计数时会变慢。 |
![]() |
17
0
我会选择国际单项体育联合会的声明是为了明确和约定,尽管我相信有些人会不同意。毕竟,你想做点什么
|
![]() |
18
0
请使用开关。if语句将花费与条件数量成比例的时间。 |
![]() |
19
0
我不是那个告诉你速度和内存使用情况的人,但是看一个开关站是一个非常容易理解的地方,然后是一个大型的if语句(尤其是2-3个月)。 |
![]() |
20
0
我会说使用开关。这样,您只需要实现不同的结果。您的十个相同的案例可以使用默认值。如果您只需要一次更改就可以显式地实现更改,那么不需要编辑默认值。从交换机添加或删除案例也比编辑if和elseif容易得多。
甚至可以根据一系列可能性来测试您的条件(在本例中是numeror),或者一个数组,这样您的开关就不会被使用,除非有明确的结果。 |
![]() |
21
0
既然您只有30个错误代码,那么就编写自己的跳转表,然后自己进行所有优化选择(跳转总是最快的),而不是希望编译器做正确的事情。它还使代码非常小(除了跳转表的静态声明)。它还有一个附带的好处,即使用调试器,您可以在运行时根据需要修改行为,只需直接戳入表数据即可。 |
![]() |
22
0
我知道它很古老,但是
改变循环计数会改变很多: 如果/否则:5毫秒 开关:1ms 最大循环数:100000 如果/否则:5毫秒 开关:3ms 最大循环数:1000000 如果/否则:5毫秒 开关:14MS 最大循环数:10000000 如果/否则:5毫秒 开关:149MS 最大循环数:100000000 (如果需要,请添加更多语句) |
![]() |
23
0
在编译程序时,我不知道有什么不同。但是对于程序本身和尽可能简单地保存代码,我个人认为这取决于您想要做什么。如果不是这样的话,如果其他陈述有它们的优势,我认为是: 允许您针对特定范围测试变量 您可以使用函数(标准库或个人)作为条件。 (例如:
然而,如果不是这样的话,if else语句会很快变得复杂和混乱(尽管你尽了最大的努力)。switch语句往往更清晰、更清晰、更易于阅读;但只能用于针对特定值进行测试(例如:
我更喜欢if-else-if-else的说法,但这完全取决于你。如果您想使用函数作为条件,或者您想根据一个范围、数组或向量测试一些东西,和/或您不介意处理复杂的嵌套,我建议使用if else if else块。如果您想要对单个值进行测试,或者想要一个干净且易于读取的块,我建议您使用switch()case块。 |
![]() |
ZenBa2 · getopt未更改值C 2 年前 |
![]() |
Waeez · 条件未满足php仍在运行 7 年前 |
![]() |
Catz · 正在尝试打印正确数量的“*”以代替数值 7 年前 |
|
privilegedMale · switch语句中的扫描仪问题 7 年前 |
![]() |
rasilvap · 具有多个参数的开关箱 7 年前 |
![]() |
RudziankoÅ · 不可能的类型切换情况:不能有动态类型 7 年前 |
![]() |
Leo Thomas · 循环case语句而不退出shell脚本 7 年前 |