2009-08-09

http://anond.hatelabo.jp/20090809140038

レジスタの多いCPUの場合で、単純なループ最適化されるとループカウンタレジスタ上に確保される。

ローカル変数の場合。全てのコンパイラを知ってる訳じゃないから、全部そうなるとは言えないけど。

Javaの場合が気になったので、二つのコードを書いてちょっと調べてみたところ、

for(int i = 0; i < 10; i++){
	System.out.println(i);
}
for(int i = 0; i < 10; i++){
	System.out.println(i);
}
  Code:
   0:	iconst_0
   1:	istore_1
   2:	iload_1
   3:	bipush	10
   5:	if_icmpge	21
   8:	getstatic	#2; //Field java/lang/System.out:Ljava/io/PrintStream;
   11:	iload_1
   12:	invokevirtual	#3; //Method java/io/PrintStream.println:(I)V
   15:	iinc	1, 1
   18:	goto	2
   21:	iconst_0
   22:	istore_1
   23:	iload_1
   24:	bipush	10
   26:	if_icmpge	42
   29:	getstatic	#2; //Field java/lang/System.out:Ljava/io/PrintStream;
   32:	iload_1
   33:	invokevirtual	#3; //Method java/io/PrintStream.println:(I)V
   36:	iinc	1, 1
   39:	goto	23
   42:	return
int i;
for(i = 0; i < 10; i++){
	System.out.println(i);
}
for(i = 0; i < 10; i++){
	System.out.println(i);
}
  Code:
   0:	iconst_0
   1:	istore_1
   2:	iload_1
   3:	bipush	10
   5:	if_icmpge	21
   8:	getstatic	#2; //Field java/lang/System.out:Ljava/io/PrintStream;
   11:	iload_1
   12:	invokevirtual	#3; //Method java/io/PrintStream.println:(I)V
   15:	iinc	1, 1
   18:	goto	2
   21:	iconst_0
   22:	istore_1
   23:	iload_1
   24:	bipush	10
   26:	if_icmpge	42
   29:	getstatic	#2; //Field java/lang/System.out:Ljava/io/PrintStream;
   32:	iload_1
   33:	invokevirtual	#3; //Method java/io/PrintStream.println:(I)V
   36:	iinc	1, 1
   39:	goto	23
   42:	return

ここまで単純だと、同じコード吐いてました。(Java 1.6.0_11)

  • ケース1のどこが悪いかわからない。 変数iのスコープを適切にして、 変な箇所でiにアクセスさせて不良を発生させるリスクを減らせって話? 私がメインはC++のコーディングするから...

    • こういう人が書いたプログラムは保守性悪いだろうな・・・ ケース1で問題なのは、for文内で行っている処理が引数付きのメソッド呼び出しであること。 引数のないメソッドや、単純な...

      • ところが今回はカウンタ変数を引数に入れてメソッドを呼び出している。 そうなると、メソッド呼び出し先で、仮引数のメモリを毎回確保することになるので、 カウンタ変数を共通...

        • C/C++ならば、ループカウンタにローカル変数を使えば、最適化されることは分かってるから保守性重視で書く。 真面目なコンパイラなら1はどっちを書いても同じようなコードになるさ。 ...

          • 真面目なコンパイラなら1はどっちを書いても同じようなコードになるさ。 同じようなコードというのはコンパイラが吐き出すアセンブラコードの話?? 真面目なコンパイラなら修正...

            • レジスタの多いCPUの場合で、単純なループが最適化されるとループカウンタはレジスタ上に確保される。 ローカル変数の場合。全てのコンパイラを知ってる訳じゃないから、全部そうな...

              • なるほどコンパイラで同じアセンブラコードはかれるんですね。 じゃ、変数のスコープ短く保つべきですね。

                • http://anond.hatelabo.jp/20090809221610 最初の文と次の文が全然つながってない気がする 吐かれるコードが一緒なのに、じゃ、の意味が分からない…

          • まー、こんな所をチマチマこだわっても、全体は良くならん。 こまけーこたぁいいんだよ!!(AA略 そこは同意。 ただ大元の増田の投稿で「退行」って騒いでいるから、そんな騒ぐほ...

          • Cから入った中途半端なC++プログラマでオブジェクト指向の理解イマイチだからかもしれないけど、私はこんなコードをよく書く。 ObjA *a = NULL; ObjB *b = NULL; int rc = RC_SUCCESS; a = createA();...

      • といったってたかが4バイトじゃないか。 ここで問題になるようなバイト数か?

      • メソッド呼び出しは、どちらの書き方でもスタックにiがプッシュされるだけでは? もしかして特殊な環境の話?

      • にやにや

    • 実際に稼げてるか分からないメモリのために、変数の寿命を短く保つというルールを曲げるのは、割が合うかどうかって話じゃないの? 「変数の寿命を短く保つ」という基本的なルール...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん