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)、コード全体で呼び出されているため使用されているため、この方法で、問題なく可能な限り低いレベルにアタッチします。

ループを回避するために、クライアントが受信したリモート応答を実行する必要があるため、 functionandを分割する必要がありました (関数プロトタイプを変更してフラグを追加することはできましたが、多くのコードが壊れてしまいます)。realFunctionrealFunction

私の懸念は、定義を無効にするときのパフォーマンスに関連してい_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 に答える