20

私は__noopについて読んでいましたが、MSDN の例は次のとおりです。

#if DEBUG
   #define PRINT   printf_s
#else
   #define PRINT   __noop
#endif

int main() {
   PRINT("\nhello\n");
}

空のマクロを使用するだけでは得られません。

#define PRINT

生成されるコードは同じです。__noop実際に役立つ有効な使用例は何ですか?

4

3 に答える 3

17

__noop組み込み関数は、関数を無視し、引数リストを解析する必要があるが、引数のコードは生成されないことを指定します。これは、可変数の引数を取るグローバルデバッグ関数での使用を目的としています。

あなたの場合、議論は明らかに副作用のない表現であり、簡単に最適化できるので、問題ではありません。

ただし、引数式に副作用がある場合や、コンパイラが正常に終了して副作用がないことをコンパイラが証明できないほど複雑な場合は、を使用__noopすると、その式の潜在的にコストのかかる評価を防ぐことができます。

2番目の利点は、構文的に可変数の引数を持つ関数呼び出しのように動作することです。したがって、関数呼び出しの代わりに使用しても、プログラムの解析には影響しません。他のいくつかの置換(空の文字列など)では、状況によっては問題になる可能性があります。

于 2013-01-22T13:02:17.453 に答える
15
#define PRINT
extern int some_complicated_calculation();
PRINT("%d\n", some_complicated_calculation());

結果が必要ない場合でも、関数を呼び出します。

を使用する__noopと、関数は呼び出されません。

PRINT引数を無視するように定義できます (コンパイラが可変長マクロをサポートしていると仮定します) 。しかし、それらはまったく解析されず、PRINT何かを行うように定義されたバリアントをコンパイルせずにそれらの周りのコードを変更すると無効になる可能性があります。を使用する__noopと、引数は引き続き解析されるため、有効なままである可​​能性が高くなります。

于 2013-01-22T13:05:40.043 に答える