Будет ли этот вызов функции оптимизирован g ++? - PullRequest
1 голос
/ 15 марта 2012

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

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 ]

3 голосов
/ 15 марта 2012

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

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

    // real function code
} 

void MultiFunction(params) 
{  } 

Примечание:

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

1 голос
/ 15 марта 2012

Сложно сказать, но это, как правило, должно быть оптимизировано (вы никогда не можете быть уверены, и лучшее, что вы можете сделать, это дать ему несколько подсказок, например, с помощью 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...