2

これは重複した質問かもしれませんが、探しているものが見つかりませんでした。存在する場合は、重複について申し訳ありません。

コードの次の部分がメモリ割り当てに関して同じであるかどうかを知りたいです。

//first
int n = some_number;
for(int i = 0; i < n; i++){
    for(int j = 0; j < n; j++){
        int a = something;
    }
}

//second
int i, j, a;
for(i = 0; i < n; i++){
    for(j = 0; j < n; j++){
        a = something;
    }
}

Javaが最初のコードで変数をa n ^ 2回およびj n回割り当てるの か、それとも2番目のコードのように両方が1回だけ割り当てられるのだろうか。

私はこれをJavaで数回試しましたが、最初の試行では8秒、2回目は9秒、別の試行では逆のように結果に一貫性がありません。だから、それらが等しいかどうかを確認したいのですが、

ありがとう

4

1 に答える 1

7

違いがあるかどうかを確認する簡単な方法の 1 つは、バイトコードを調べることです。

最初のバージョンは次のようにコンパイルされます。

  public static void f();
    Code:
       0: bipush        100
       2: istore_0      
       3: iconst_0      
       4: istore_1      
       5: goto          26
       8: iconst_0      
       9: istore_2      
      10: goto          18
      13: iconst_3      
      14: istore_3      
      15: iinc          2, 1
      18: iload_2       
      19: iload_0       
      20: if_icmplt     13
      23: iinc          1, 1
      26: iload_1       
      27: iload_0       
      28: if_icmplt     8
      31: return        

一方、2番目は次のようにコンパイルされます。

  public static void g();
    Code:
       0: bipush        100
       2: istore_3      
       3: iconst_0      
       4: istore_0      
       5: goto          26
       8: iconst_0      
       9: istore_1      
      10: goto          18
      13: iconst_3      
      14: istore_2      
      15: iinc          1, 1
      18: iload_1       
      19: iload_3       
      20: if_icmplt     13
      23: iinc          0, 1
      26: iload_0       
      27: iload_3       
      28: if_icmplt     8
      31: return        

よく見比べてみると、本質的に同じであることがわかります。

スタイル的には、最初の使用にできるだけ近い変数を宣言することが望ましいと思います。これを念頭に置いて、2 番目のバージョンよりも 1 番目のバージョンを選択します。

于 2013-04-11T07:28:05.263 に答える