По иронии судьбы, именно этот тест я выполнил всего пару дней назад для самых последних компиляторов. Как и в случае с последними компиляторами, clang
создает одну и ту же сборку для switch
и if
- для небольшого числа случаев (ниже 5) он производит набор прямых условных переходов, тогда как для 5 или более случаев это делает косвенный скачок таблицы.
С другой стороны, gcc
трактует их по-разному: switch
преобразует в косвенный переход к таблице, в то время как серия операторов if
остается серией условных прямых переходов.
Стоит также отметить, что если в корпусе переключателя есть «дыры» (т. Е. Возможные значения управляющей переменной, которые не указаны в регистре), он все равно может быть преобразован в серию условных прямых переходов или косвенных переходов таблицы. , но я не смог понять точную формулу.
Вот некоторый игровой код:
https://gcc.godbolt.org/z/Lll1Kd