temp変数でプログラムが遅くなることはありますか?
質問
以下のような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++コードの最適化 : コンスタントフォールディング
関連
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] 8192個の要素にループをかけると、プログラムが遅くなるのはなぜですか?
-
[解決済み] Project Eulerとの速度比較。CとPythonとErlangとHaskellの比較
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】Javaで(a != 0 && b != 0)よりも(a*b != 0)の方が速いのはなぜか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
[解決済み] 初期化でポインタ対象の型から修飾語を捨てる
-
[解決済み] PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init ( &mutex, param )
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] ⑭と⑯は何のためにあるのですか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] C言語でランダムなint型を生成するには?
-
[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?
-
[解決済み】GCCを使用して読みやすいアセンブリを作成しますか?