レジスタの多い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
ケース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がプッシュされるだけでは? もしかして特殊な環境の話?
にやにや
実際に稼げてるか分からないメモリのために、変数の寿命を短く保つというルールを曲げるのは、割が合うかどうかって話じゃないの? 「変数の寿命を短く保つ」という基本的なルール...