4


0

Cプリプロセッサを使用して効果的に変数の名前を変更する

いくつかの非常にタイトなループを作成しており、最も外側のループは1か月以上実行されます。 関数のローカル変数が少なければ少ないほど、コンパイラが最適化できることを理解しています。 ループの1つでは、いくつかのフラグが必要ですが、一度に1つしか使用されません。 あなたが私の住んでいる場所を知っていることわざの殺人マニアであれば、 `flag`という名前のフラグを持ち、全体を通してそのようなものを使用するか、またはあなたは

unsigned int flag;

while (condition) {

#define found_flag flag
  found_flag = 0;
  for (i = 0; i

これは、新しい変数を追加せずに各フラグの説明的な名前を許可する利点を提供しますが、少し正統的ではないようです。 私は新しい* C *プログラマーなので、ここで何をすべきかわかりません。

3 Answer


14


これを気にせず、各フラグに新しい変数を使用してください。 コンパイラーは、それぞれが最初と最後に使用される場所を判別し、それに応じて実際に使用されるスペース量を最適化できます。 フラグ変数の使用がオーバーラップしない場合、コンパイラはすべてのフラグ変数に同じスペースを使用することになります。

何よりも読みやすいコード。


3


私はhttps://stackoverflow.com/questions/3581422/using-the-c-preprocessor-to-effectively-rename-variables/3581431#358143[dreamlax:コンパイラは十分に賢い]を無視してこれに完全に同意します完全に発行しますが、3番目のオプションを無視したことを言及したいと思います。

while (something) {
  /* setup per-loop preconditions */
  {
    int flag1;
    while (anotherthing) {
      /* ... */
    }
    /* deal with flag found or not-found here */
  }

  /* possibly some other preconditions */
  {
    int flag2;
    while (stillanotherthing) {
      /* ... */
    }
  }
}

これは、各フラグの処理が終了すると、ダムコンパイラに_explicitly_を通知します。 フラグスコープブロックを超えて存在する必要がある変数を宣言する場所に注意する必要があることに注意してください。


3


あなたのトリックは、正確なレジスタ(再)割り当てとスケジューリングができない、非常に古い、非常に単純な、またはバグのあるコンパイラでのみ有用です(場合によっては、さまざまなまたは古代の組み込みプロセッサにこだわっています)。 gcc、および最新のコンパイラは、最適化が有効になっている場合、ローカル変数に使用されるレジスタまたはローカルメモリリソースを、マシンコードレベルでデバッグするときに見つけるのがほとんど困難になるまで再割り当てします。 そのため、コードを読みやすくし、この種の時期尚早な最適化に頭を悩ませる必要はありません。