Создание таблицы переходов
Если значения ветвей выбора представляют собой арифметическую прогрессию, то можно сформировать таблицу переходов – массив, проиндексированный case-значениями и содержащий указатели на соответствующие им case-обработчики. В этом случае, сколько бы оператор switch ни содержал ветвей, – один или миллион – он выполняется за одну итерацию. Красота!
Создавать таблицы переходов умеют все три рассматриваемых компилятора, и следующий пример успешно оптимизирует каждый из них.
switch (a)
{
case 1 : …;
case 2 :…;
case 3 :…;
case 4 :…;
case 5 : …;
case 6 :…;
case 7 :…;
case 8 :…;
case 9 :…;
case 10 :…;
case 11 :…;
}
Однако WATCOM плохо справляется с переупорядоченной прогрессией и совсем не справляется с несколькими независимыми прогрессиями. Компиляторы Microsoft Visual C++ и Borland C++ успешно оптимизируют следующий пример, а WATCOM создаст обычное несбалансированное логическое дерево, в худшем случае выполняющееся за одиннадцать итераций, что на порядок хуже, чем у конкурентов.
switch (a)
{
case 11 : …;
case 2 : …;
case 13 : …;
case 4 : …;
case 15 : …;
case 6 : …;
case 17 : …;
case 8 : …;
case 19 : …;
case 10 : …;
case 21 : …;
}