1. ホーム
  2. c

temp変数でプログラムが遅くなることはありますか?

2023-10-06 17:10:41

質問

以下のようなC言語コードがあるとします。

int i = 5;
int j = 10;
int result = i + j;

これを何度もループさせる場合は int result = 5 + 10 ? 私はよくコードを読みやすくするために一時的な変数を作成します。例えば、2つの変数がインデックスを計算するためにいくつかの長い式を使用していくつかの配列から取得された場合です。これはC言語ではパフォーマンス的に悪いのでしょうか?他の言語ではどうでしょうか?

どのように解決するのですか?

最近の最適化コンパイラは、これらの変数を最適化するはずです。例えば、次のような例で ゴッドボルト gcc を使って -std=c99 -O3 フラグ ( ライブを見る ):

#include <stdio.h>

void func()
{
  int i = 5;
  int j = 10;
  int result = i + j;

  printf( "%d\n", result ) ;
}

とすると、以下のようなアセンブリになります。

movl    $15, %esi

の計算のために i + j のような形になります。 定数伝搬 .

注、私は printf を追加し、副作用がないようにしました。 func に最適化されていたことでしょう。

func:
  rep ret

これらの最適化は as-if ルール の下では、コンパイラはプログラムの観測可能な動作をエミュレートすることだけを要求します。これは C99 標準規格の草案でカバーされています。 5.1.2.3 プログラムの実行 というのがあります。

抽象機械では、すべての式はセマンティクスで指定されたとおりに評価されます。 評価されます。実際の実装では、式の一部を評価する必要はありません。 実際の実装では、その値が使用されず、必要な副作用が生じないことが推測できる場合は、式の一部を評価する必要はありません。 必要な副作用(関数の呼び出しや揮発性オブジェクトへのアクセスによって生じるものを含む)が発生しないことが推測できる場合,実際の実装では式の一部を評価する必要はありません。 関数の呼び出しや揮発性オブジェクトへのアクセスによるものも含む)。

も参照してください。 C++コードの最適化 : コンスタントフォールディング