学校では、プリプロセッサステートメントは簡単に混乱する可能性があるとよく教えられました。たとえば、次のような文字列を定義するからです。
#define PI 3.1415926
コード内のあらゆる場所で置換されるため、変数名に文字列が含まれていると、奇妙な置換が発生しますPI
。
したがって、デバッグするときは、次のアプローチから離れます。
#define _DEBUG
...
#ifdef _DEBUG
// debug code
#endif
...
しかし、使用する方が「安全」だと考えました。
const static bool DEBUG = true
int main()
{
...
if(DEBUG){ /* debug code*/ }
...
}
これはうまく機能しますが、プリプロセッサステートメントのアプローチと比較して、このアプローチの実行時のオーバーヘッドは何でしょうか。プリプロセッサアプローチでは、すべてがコンパイル前に行われるため、実行時のオーバーヘッドは予想されません。
単純なステートメントのオーバーヘッドはほとんど無視できることを私は知っていますが、if
これは、多数回実行されるいくつかのネストされたループに深く入れられた場合には当てはまりません(小さなものが大きなものになります)。
コンパイラは、これを実行可能ファイルにハードコードし、コンパイル時にデバッグコードをすでに有効または無効にしてDEBUG
いるという事実を認識していますか?これを疑うのは、先日、無関係なコードで作業しているときに、コードの一部が廃止されたという警告があったことです。これは、コードを囲む-statementが真になることはないためです(正しく覚えていれば)。const static
if