Будет ли этот вызов функции оптимизирован g++?

У меня следующая ситуация:

void function(params)
{
  #ifdef _MULTIPLAYER
    if (isConnected)
    {
      if (isClient)
      {
        requestFunctionRemotely(params)
        return;
      }
      else if (isServer)
      {
        call realFunction(params) remotely on client;
      }
    }
  #endif

  realFunction(params);
}

realFunction(params)
{
  ...
}

В этой ситуации я могу построить свой проект как с одним экземпляром, так и с несколькими игроками.

Этот подход был использован потому, что function(params) вызывается вокруг всего моего кода, поэтому я просто подключаюсь к минимально возможному уровню без проблем.

Я должен был разделить function а также realFunction потому что удаленные ответы, полученные клиентами, должны быть выполнены через realFunction чтобы избежать циклов (я мог бы изменить прототип функции, добавив флаг, но я бы сломал много кода).

Моя проблема связана с производительностью при отключении _MULTIPLAYER определить. У меня много function(params) и я позвоню им тысячу раз. Мне придется использовать этот подход для всех из них. G ++ оптимизирует двойной вызов, когда найдет

function(params) {
  realFunction(params);
}

в

function(params) {
  // body of realFunction
}

и есть ли способ заставить его в любой подобной ситуации?

Просто как подсказка: в настоящее время я использую -O2 флаг

2 ответа

Решение

Если вы хотите быть уверены, что можете инвертировать шаблон и использовать параметр шаблона. Таким образом, вы уверены, что компилятор удалит if (false) во время компиляции.

template <bool isMulti>
void Function(params) 
{ 
    if (isMulti)
        MultiFunction();

    // real function code
} 

void MultiFunction(params) 
{  } 

Замечания:

Если вы работаете с классом, вы можете переместить параметр шаблона к классу для краткости.

Трудно сказать, но обычно это следует оптимизировать (вы никогда не можете быть уверены, и лучшее, что вы можете сделать, это дать ему несколько советов, например, с помощью inline, но компилятор обычно пытается найти лучшее решение сам (также основанный на "оптимизировать размер" против "оптимизировать скорость", игнорируя при этом ваши подсказки (они НЕ ДОЛЖНЫ это делать)).

Вероятно, лучшим (и надежным) решением было бы написание кода таким образом, чтобы избежать этого, например что-то вроде этого:

type function(params)
{
#ifdef _MULTIPLAYER
    if(client)
    {
        // call server
    }
    else
#endif
    { // this bracket will be ignored, but saves adding another `#ifdef..#endif` block just to close it again below
        // do stuff here
    }
}
Другие вопросы по тегам