« 2880pxよりも大きい画像を読み込む方法を発見したよ | メイン | TwitterClockバージョンアップ »

あなたは前置派? それとも後置派?

自分の中の常識と世の中の常識にズレを感じるシリーズ第一弾(第二弾は未定)

大学の頃、プログラミングの授業で「後置演算子は一旦レジスタに退避させなきゃならないので前置演算子に比べると遅くなる」と習って以来、必要に迫られない限りはできるだけ前置で書くようにしている。
特に長大なループ文のインクリメントでは必ず前置演算子で書くことを心がけているのだが、ネットに転がっているソースコードのほとんどが後置演算子で書かれていて、何か陰謀を感じずにはいられない。

たとえば a - ++i のように演算子に続く場合は可読性の問題から後置にしてしまうのは理解できる。 ← (はてブコメントより指摘、思いっきりおかしなこと書いてました)
でもループ文のインクリメントってほとんど単独記述じゃないだろうか?

計算速度の向上から無視できるレベルになってるとはいえ、最適化のTipsなブログでも前置演算子で書かれているのは稀なのが気になってしょうがない。
本当にソースコードの可読性の問題で片付けてしまっていいのかな。

詳しい人教えてください。

トラックバック

このエントリーのトラックバックURL:
http://void.heteml.jp/mt/mt-tb.cgi/47

コメント

ぜんぜん詳しくないので推論ですが・・・。

ループ文の場合、初期値として指定した数=最初に代入される数というのが感覚的に分かりやすいからかなという気がしました。

恐らく、VC++などの優秀なコンパイラでは、for文に書いた単一の後置演算子なんかは、レジスタに退避されないコードが最適化によって生成されている(と思う)ので、その辺りに気を配らなくていいからだと思います。

Flashのコンパイラは基本的に、特に最適化に関しては信用ならないので、理由が無い限りは前置演算子を書くようにしてます。

記憶が曖昧ですが、少なくともAS2の時は、後置インクリメントは必ずスタックに演算前の値が積まれていたような気がします。

>taka:niumさん
while文の内部で一度だけ使うような場合は確かにそうした方がいいですね。
エントリではfor文のインクリメントのつもりで書いてました。

>yossyさん
ああ、なるほど。
確かにコンパイラでそこまでやってくれてそうですね。
AS3ではどうなんでしょうか…話を聞く限りではなんとなく最適化してくれてなさそうw

どうもコンパイラ側で最適化されてるみたいですね:)
極簡単なコードを用いて FlashCS3@AS3、FlashMX@AS1にて確認した限りですが、
単独記述の場合は、前置/後置どちらも同じバイトコードが出力されましたが、代入や比較対象として記述した場合には、それぞれ異なるバイトコードとなりました。

>qurageさん
おぉ!それは朗報。
これで気兼ねなく使えそうです。
すごい無駄な知識っぽいですが(--;

コメントを投稿

あわせて読みたい