gpt4 book ai didi

c - 对于较大的 switch case 语句,将它们分开更好吗?

转载 作者:行者123 更新时间:2023-12-02 05:52:20 26 4
gpt4 key购买 nike

快速提问。例如,处理大约 1000 个选项的更大案例:哪个是“最佳”方法?我并不是特别想要更快的结果。

switch (foo) {
case 0:
// code ...
break;

// One, two, skip a few...

case 1000:
// code ...
}

或拆分可能结果的东西,以便它可以快速找到正确的 case 语句。也类似:

if (foo < 101) {
if (foo < 51)
switch (foo) {}
else
switch (foo) {}
} else if (foo > 100 && foo < 201) {

// skipped for convenience

} else if (foo > 900) {
if (foo < 951)
switch (foo) {}
else
switch (foo) {}
}

我想第二种方法对于较大的数字要快得多,但第一种方法似乎也可以轻松通过它,因为它不会不断检查语句。这些方法中的一种是不受欢迎的还是有更好的方法?这是针对 C 的,但我有兴趣了解它与其他语言的一致性。谢谢!

最佳答案

如果编译器使用跳转表来实现

switch 语句,它们的速度会非常快,但这只有在 case 的特殊序列上才有可能,而且可能并不实际取决于可能的情况。编译器可能使用也可能不使用跳转表,我确实找到了这个 http://blog.jauu.net/2010/06/15/GCC-generated-Switch-Jump-Tables/这有点有趣。

JUMP 表可以非常快,因为它只计算偏移量并跳转到适当的地址。

GCC 确实有 -fno-jump-tables 可以完全禁用它。

有时您可以使用函数指针数组和特殊索引构建您自己的跳转表,这可以使您的代码非常快,但并非在所有情况下都实用,假设您有一个开关,并且在每种情况下您都会调用函数,你可以构建一个函数指针数组,设置一个默认函数只是为了安全,然后你可以简单地做 fun_table[indice](); 而不是 switch 我自己做了一次虚拟机。

关于c - 对于较大的 switch case 语句,将它们分开更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11131410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com