6

コード全体のいくつかの場所でロギング関数が呼び出されています。すべてのログに、2つのコンパイル時定数を指定する必要があります。達成するための2つのアプローチがあります:

(1)関数の引数

template<typename T>
void log (const T &obj, const int LINE, const int COUNT)
{
  // T is used for some purpose
  if(debug)
    logging(obj.out(), LINE, COUNT);
}

それを、

log(str, __LINE__, __COUNTER__);

(2)テンプレートパラメータ

template<typename T, int LINE, int COUNT>
void log (T &obj)
{
  // T is used for some purpose
  if(debug)
    logging(obj.out(), LINE, COUNT);
}

それを、

log<__LINE__, __COUNTER__>(str);

最初のアプローチは単純さを提供するため、私は決定できませんが、コンパイル時に定数を渡します。2番目のアプローチは完璧ですが、コンパイル時間はおそらく長くなります。この作業は面倒で、まだ実装していないので、ベンチマークはありません。

誰かが彼らの経験/知識からこれに答えることができれば、それは大きな助けになるでしょう。

4

2 に答える 2

4

これら2つの選択は呼び出し元のコードに違いをもたらすため、マクロを介してログを記録することをお勧めします。そうすれば、これらを簡単に切り替えることができるので、どちらが優れているかを心配する必要はありません。

実際のアプリケーションを作成したら、マクロ定義をいじって2つを比較できます。最適化する生産性の高い領域がある場合は、そうではありません。大きな違いが生じることが判明した場合は、ビルド構成に対して開いたままにして、使用するかどうかを決定することもでき-DLOGGING_COMPILES_QUICKLYます-DLOGGING_RUNS_QUICKLY

マクロのもう1つの潜在的な利点は、debugtrueの場合にのみ、最初の引数が評価されるように調整できることです。strのインターフェイスが何であるか、またはそれらのオブジェクトがどこから来ているのかはわかりませんが、に渡す適切な値を生成するのに費用がかかりloglogデバッグ以外の場合にそれを使用しない場合、それは可能性があります実行時間の無駄。

于 2011-12-19T10:32:57.337 に答える
3

私は最初のオプションで行きます。2つの整数を渡すことによるパフォーマンスへの影響はごくわずかです。オプティマイザはおそらく関数呼び出しをインライン化します。その場合、2つの間に違いはありません。2番目のオプションは、理由もなく同じ関数のバージョンを多数作成するため、悪い考えだと思います。

于 2011-12-19T07:00:04.897 に答える