0

私は科学的な流体力学コードに慣れています。コードはほとんどの場合、プリプロセッサ ディレクティブを使用します。

#ifdef PARTICLES
    int nghost = 5
#else
    int nghost = 4
#endif

より単純な C フラグの代わりに、

int nghost = 4;
if( particlesFlag ) { nghost = 5; }

プリプロセッサ フラグの欠点は、(このフレームワークでは) 各ビルドの前に問題のセットアップごとに (ヘッダー ファイルの作成を伴う) 構成が必要になることです。これに対して、C コード フラグを使用すると再コンパイルが必要になるだけです。

このアプローチの利点は何ですか?

効率の改善は信じられないほど小さいように思えます --- 特に、このコード (たとえば) はプログラムの初期化時に 1 回しか実行されず、実際の作業はすべて異なるプロセッサ間のループで行われているなどの理由からです。

4

1 に答える 1

0

nghostを使用するAPIが何千もあるとします。PARTICLESがすでに定義されている場合、前処理中にこれらの変数はすべて5に置き換えられ、それ以外の場合は4に置き換えられます。

あなたは単一のインスタンスについて話している、大きなプロジェクトは前処理が役立つところです。

これについて考えます。

int x() { int a = nghost *5; }
int ab() { return (nghost+10); }

毎回、使用する場合、その実行時間は消費します

int x() { 
int a;
int nghost = 4;
if( particlesFlag ) { nghost = 5;}
a=nghost*5;
}


int ab() { 
int nghost = 4;
if( particlesFlag ) { nghost = 5;}
return (nghost+10); 

}

等々。

そしてこれについても考えてください。

推定

#ifdef PARTICLES
int nghost = 5
int aghost = 5
int bghost = 5
int cghost = 5
int dghost = 5
int eghost = 5
int fghost = 5
#else
int nghost = 4
int aghost = 4
int bghost = 4
int cghost = 4
int dghost = 4
int eghost = 4
int fghost = 4
#endif
于 2013-02-08T18:48:34.553 に答える