Я думаю, что даже ваша первоначальная предпосылка - что вы можете оптимизировать оператор if
путем перестановки условного выражения, вполне может быть ошибочной. В неоптимизированной сборке вы можете обнаружить, что выполнение того, о чем вы говорите, имеет определенную ценность - возможно. В общем случае вам придется прыгать хотя бы один раз в любом случае, так что нет никакой пользы (в общем случае) в том, чтобы расположить условные выражения в любом случае. Но это для неоптимизированных сборок, так кого волнует эта оптимизация?
В оптимизированных сборках, я думаю, вы можете быть удивлены тем, что компилятор иногда генерирует для оператора if. Компилятор может переместить один или другой (или оба) дела куда-то за пределы строки. Я думаю, что вы пытаетесь наивно оптимизировать это, играя с условием «на первом месте», не обязательно будете делать то, что вы хотите. В лучшем случае вы должны делать это только после изучения того, что генерирует компилятор. И, конечно, это становится дорогостоящим процессом, поскольку даже малейшее изменение, которое вы вносите в оператор, может изменить то, как компилятор решит сгенерировать выходной код.
Теперь, что касается оператора switch, я всегда буду использовать switch
, когда это делает код более читабельным. Худшее, что компилятор должен делать с оператором switch
, эквивалентным оператору if
, - это генерировать тот же код. В более чем нескольких случаях операторы switch обычно компилируются в виде таблицы переходов. Но с другой стороны, набор if
тестов, сравнивающих одну переменную с набором значений, вполне может быть распознан компилятором так, что он сделает то же самое. Тем не менее, я предполагаю, что использование переключателя позволит компилятору быстрее распознать ситуацию.
Если вы действительно заинтересованы в том, чтобы получить максимальную отдачу от этого условия, вы можете использовать что-то вроде Оптимизация профиля профиля MSVC (PGO или 'pogo'), которая использует результаты профилирования работает, чтобы оптимизировать, как создаются условия. Я не знаю, имеет ли GCC аналогичные возможности.