| ▲ | kibwen 4 hours ago | |
> Therefore, the standard forces the compiler to generate "safe" code for the switch. Safety, as usual, has cost, so the switch version ends up doing a bit more per loop iteration. Safety only has a cost in this case because the switch is fundamentally just operating on an integer. With an actual enumerated type (rather than C's primitive "enums as numeric aliases"), which even a basic type system could trivially enforce, there would be no need for this check, because the domain of the value would be guaranteed at compile-time. | ||
| ▲ | flohofwoe 4 hours ago | parent [-] | |
FWIW it's possible to get rid of the range check via a __builtin_unreachable in the default case (which of course is essentially injected UB): https://www.godbolt.org/z/YTcY3E8hx ...it's actually interesting though that the compiler adds the range check on a 'complete' switch over an enum, because the compiler would complain when a case branch is missing (via a warning). E.g. the frontend is smarter than the backend. | ||