3 ms·
Are you sure? I'd guess that if the cases are an interval of consecutive integers it may do a "jmp [c]" sometime.
by enriquto 7y ago
Are you sure? I'd guess that if the cases are an interval of consecutive integers it may do a "jmp [c]" sometime.
- vortico 7y agoLooks the same to me. https://godbolt.org/z/CfhD5k https://godbolt.org/z/CfhD5k Switches were invented mostly because they were an easy hint to the compiler to reduce to a tree search, but because compilers are smart today, they're obsolete unless you just prefer their syntax. Even if the cases are consecutive, most compiler optimizers are smart enough to determine that the ASTs are equivalent.
- enriquto 7y ago> they're obsolete unless you just prefer their syntax. This is a good point. Sometimes I prefer the (ugly) syntax of switches than that of conditionals. The reason is that a chain of conditionals is non-symmetrical (there's no condition for the first "case"), while a switch is formally invariant to permutation of the cases. I have even seen shit like this: if (false) ; else if (c == 1) { first case ; } else if (c == 2) { second case; } ... just to preserve the symmetry along the cases.
- vortico 7y agoAre you talking about the `else` being non-symmetric? You don't need it at all. I do this. if (c == 1) { first case ; } if (c == 2) { second case; }
- KMag 7y agoYou're correct. Many compilers will emit jump tables if the domain is dense enough. Also, even if compiling to a bunch of conditional jumps, they'll usually emit them to require O(log N) conditional jumps (equivalent to a binary tree of nested ifs) instead of the O(N) linear arrangement suggested by the GP.
- vortico 7y agoClang compiles both switch statements and `if` statements to the same tree search code. E.g. https://godbolt.org/z/7M_3PU https://godbolt.org/z/7M_3PU My point is that the optimizations you're describing for switch statements are also applied to a bunch of `if` blocks, at least in LLVM-based languages with an LLVM version from the last several years.
- KMag 7y agoSure, I didn't mean to imply that compilers never (or commonly didn't) detect that long if-chains could be optimized to jump tables, lookup tables, or if-trees. I was just answering the more narrow question the GGP was asking: if switch statements were always lowered to if-chains and never compiled to jump tables.
- vortico 7y agoAh I see, gotcha.