我有以下情况:
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
标志
答案 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
}
}