gpt4 book ai didi

C++、switch case 和编译器

转载 作者:太空狗 更新时间:2023-10-29 19:40:48 27 4
gpt4 key购买 nike

根据我从类似问题的各种答案中读到的内容,switch case 在某些情况下的编译方式不同。

我有几个场景,但我不确定它们将如何编译。

场景一

采用枚举值的开关盒。案例的范围从 0 - 99 并且是有序的。

场景2

采用枚举值的开关盒。案例的范围可以说是 0 - 30、50 - 80、100 - 150。无序。这会与上面的场景不同地编译吗?


基本上,我想知道场景中的 switch case 是如何编译的,以及这两个场景之间是否存在任何差异。谢谢!

编辑:我应该提到我最大的担忧之一是需要多少检查才能匹配案例。如果语句是线性的,那么对于场景一,如果它是一个 if-else-if 最多需要 100 次检查,除非我弄错了。但是如何用 switch-cases 处理呢?编译器做了哪些优化?

最佳答案

一般情况下没法说。 C++ 标准几乎不对生成的代码做任何假设。这意味着只要语义保持不变,编译器几乎可以自由地(是的,有异常(exception))重新排序您的代码。当我参加该主题的类(class)时,优化通常被称为“编译器构造的黑魔法”。

考虑到这一点,您的编译器可能会输出相同或不同的代码。它可能会为某些优化级别吐出相同的代码,而为其他优化级别吐出完全不同的代码。它可能完全取决于您在 case block 本身中使用的代码。如果您在两点有相同的代码,它可能只是优化它以使用该代码一次,或者可能不会。

知道会发生什么的唯一方法是查看带有某些固定标志的编译器的输出,看看会发生什么。一旦您发现会发生什么,请不要依赖它,它可能会在下一个版本的编译器中发生变化。

如果您正在编程,请始终遵守语言标准为您提供的保证,并且永远不要做任何超出此范围的假设。

关于C++、switch case 和编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9946329/

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