aoisome回答ポイント 90ptウォッチ 1

Javaプログラミングの件で質問です。


public class Test {
public static void main(String[] args) {
int a = 0;
a = 3;
a = 4;
System.out.println(a);
}
}

上のプログラムをコンパイルして生成されたclassファイルを逆アセンブルします。

Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return

public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iconst_3
3: istore_1
4: iconst_4
5: istore_1
6: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
9: iload_1
10: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
13: return

}

すると、上のような結果になります。
変数aに対して0,3,4を順番に代入していますので、istore_1が3回出てきますが、そのうち最後のistore_1以外は明らかに無駄な処理です。
0と3の代入については、その値を使うことが無いので、最適化によって処理自体が取り除かれても良さそうな気がするのですが…
このような明らかに無駄と思える処理について、javacが最適化を行わない理由をご存知でしたら、教えてください。

※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
ログインして回答する

みんなの回答

この質問へのコメント

コメントはありません

この質問への反応(ブックマークコメント)

質問の情報

登録日時
2008-10-05 22:17:30
終了日時
2008-10-12 22:20:02
回答条件
1人2回まで

この質問のカテゴリ

この質問に含まれるキーワード

Java1731アセンブル6コンパイル428プログラミング1135変数1063最適化164Class541プログラム5048

人気の質問

メニュー

PC版