这个函数调用是否会被g ++优化?

时间:2012-03-15 00:21:01

标签: c++ optimization g++ function-call

我有以下情况:

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),所以这样我就可以在没有问题的情况下连接到最低级别。

我必须拆分functionrealFunction,因为客户端收到的远程响应必须通过realFunction执行以避免循环(我可以更改函数原型以添加标志但是我会破坏很多代码。)

我的担忧与禁用_MULTIPLAYER定义时的效果有关。我有很多function(params),我会称他们为数千次。我将不得不对所有这些使用这种方法。 g ++会在找到

时优化掉双重调用
function(params) {
  realFunction(params);
}

function(params) {
  // body of realFunction
}

并且有办法在每种类似的情况下强制它吗?

正如提示:我目前使用-O2标志

2 个答案:

答案 0 :(得分:3)

如果您想确保可以反转模式并使用模板参数。这样你就可以确定编译器会在编译时删除if (false)

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

    // real function code
} 

void MultiFunction(params) 
{  } 

注意:

如果使用类,可以将模板参数上移到类中以获得简洁。

答案 1 :(得分:1)

这很难说,但通常应该优化(你永远不能确定,你能做的最好就是给它一些提示,例如使用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
    }
}