Пожалуйста, рассмотрите также прогноз ветвления, прежде чем отвечать на этот вопрос.
У меня есть несколько сценариев, в которых я могу заменить условный оператор вызовом функции с помощью указателя на функцию.(вы можете думать о компонентно-ориентированном программировании, а не о наследовании для аналогичного типа senario)
class Shape
{
float Area()
{
if(type == SQUARE)
{
return length*length;
}
else if(type == RECTANGLE)
{
return length*breadth;
}
}
}
Один и тот же класс может быть написан так.
class Shape
{
void SetAreaFunction(void *funcptr)//this function is used to set the current AreaFunc
{
CurrentAreaFunc = funcptr ;//this holds the pointer to current area func
}
float SqauareArea();//this will return square area
float RectangleArea();//this will return rectangle area
float Area()
{
currentAreaFunc();
}
}
ЕСЛИ вы рассматриваете вышеупомянутые случаиоба достигают одинаковых результатов. Но я думаю о снижении производительности. Во втором случае я избегаю проблем с предсказанием ветвлений с помощью вызова функции.
Теперь дайте мне знать, что лучшеи «лучше оптимизированный код» в этом типе senarios (кстати, мне не нравится утверждение «преждевременная оптимизация - корень всего зла», поскольку оптимизация имеет свои преимущества, поэтому я считаю, что оптимизировать свой код!)
PS: Я не против, если кто-нибудь даст подробный обзор о том, «как плохое предсказание ветвления может быть», даже в коде сборки.
Обновление: после профилирования (аналогичный код выше),
Если Условие преуспело в этом типе senario.Can любой может дать причину для этого? Функциональный код вызова может быть предварительно выбран, так как нет кода Разветвления правильно? Но hпрежде чем он выглядит иначе ... разветвленный код выигрывает!: O Профилировано на Intel Mac Osx, GCC O3 / Os оптимизация.