1

我有以下情况:

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)在我的代码周围都被调用,所以通过这种方式,我只是附加到可能的最低级别而不会出现问题。

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

我担心禁用_MULTIPLAYER定义时的性能。我有很多,function(params)我会打电话给他们上千次。我将不得不对所有人使用这种方法。g++ 会在找到时优化掉双重调用

function(params) {
  realFunction(params);
}

function(params) {
  // body of realFunction
}

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

只是作为一个提示:我目前使用-O2标志

4

2 回答 2

3

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

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

    // real function code
} 

void MultiFunction(params) 
{  } 

笔记:

如果使用类,您可以将模板参数上移到类以进行简洁。

于 2012-03-15T00:39:23.963 回答
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
    }
}
于 2012-03-15T00:29:49.973 回答