Я очень сомневаюсь, что это приведет к какому-либо приросту производительности, за исключением, по крайней мере, очень специфического сценария. В этом сценарии вы изменяете a, b и c, и, следовательно, какой из трех триггеров, вызывающих код, изменяется, но код выполняется в любом случае, а затем сокращение кода до одного оператора if может улучшиться, поскольку процессор может иметь код в кеш веток, когда он доберется до него в следующий раз. Если вы утроите код, чтобы он занимал в 3 раза больше места в кэше ветвлений, существует большая вероятность того, что один или несколько путей будут вытеснены, и, таким образом, у вас не будет самого эффективного выполнения.
Это очень низкий уровень, поэтому, опять же, я сомневаюсь, что это окажет большое влияние.
Что касается читабельности, которую легче читать:
- если что, сделай это
- если что-то еще, сделайте это
- если еще что-то еще, сделайте это
- «это» одинаково во всех трех случаях
или это:
- если что-то, или что-то еще, или еще что-то еще, то сделайте это
Поместите туда еще немного кода, кроме простого вызова функции, и становится трудно определить, что это на самом деле три идентичных фрагмента кода.
Из-за этого ремонтопригодность ухудшается с организацией if-3.
У вас также есть дублированный код, почти всегда признак плохой структуры и дизайна.
По сути, я бы сказал программисту, что если у него проблемы с чтением способа написания 1 оператора if, возможно, C ++ - это не то, что он должен делать.
Теперь давайте предположим, что части "a", "b" и "c" действительно большие, так что операторы OR там теряются в большом количестве шума с круглыми скобками или нет.
Я бы все же реорганизовал код так, чтобы он вызывал функцию (или выполнял код там) в одном месте, так что, возможно, это компромисс?
bool doExecute = false;
if (a) doExecute = true;
if (b) doExecute = true;
if (c) doExecute = true;
if (doExecute)
{
f();
}
или, что еще лучше, использовать преимущества логического короткого замыкания, чтобы избежать ненужных оценок:
bool doExecute = a;
doExecute = doExecute || b;
doExecute = doExecute || c;
if (doExecute)
{
f();
}