2016-06-30 5 views
1

ほとんどの場合、私はその中で多くの変数を作りますが、コードをデバッグするのが簡単だからです。コンパイラの最適化 - 変数のメモリ使用量

私はこの機能を持っているとしましょう:

void foo(int value) { 
    int x = value * 1; 
    int y = value * 2; 
    int z = value * 3; 

    int u = x + 1; 
    int v = y + 2; 
    int w = z + 3; 
} 

このコードは、罰金やデバッグにその簡単です(あなたは何が起こっているかをステップバイステップを見ることができる)が、その大量のメモリを使用して(それを考慮すると28のバイト各intは4バイト)であり、それはこの方法で最適化することができます

    :これに基づき

    void foo(int value) { 
        int u = value * 1 + 1; 
        int v = value * 2 + 2; 
        int w = value * 3 + 3; 
    } 
    

    私はいくつかの質問を持っています

  1. コンパイラはリリースビルドでこの種の最適化を行っていますか?
  2. 多くのレジスタの使用を避けるために、関数内で使用されていない変数のメモリを再利用しますか?
+1

現実世界の例が良いかもしれません。これらの関数はnon-opsであり、完全に最適化されている可能性があります。生成されたアセンブルを常にチェックして、コンパイラがコードをコンパイルした後に実際に実行するかどうかを確認することはできません。 – NathanOliver

+1

しかし、関数が返るとすぐに、これらの28バイトは次の関数呼び出しのために解放されます。それらはスタックに一時的に格納されています(これは "割り振る"にもかなり安い)。 – Steve

+1

関数の実行はその存在に依存しないため、ほとんど存在しない可能性があります。また、レジスタの割り当ても重要です。ほとんどのローカル変数はメモリにありません。 – harold

答えて

3

はい。現代のコンパイラはそれらの中間変数を削除します。はい。現代のコンパイラは定数を折りたたみ、レジスタとメモリの場所を再利用します。

要するに、このレベルでのことについて心配しないでください。コンパイラはそれを修正します。代わりに読み取り可能なコードやアルゴリズムの改良を書くことを心配し、コンパイラに詳細を残して - それは、これらの日はかなり賢いです;)

関連する問題