ページ 11

変数初期化(XOR)に関しての意見

Posted: 2010年7月28日(水) 08:51
by ぜらーちん
お世話になってます。
今回は変数初期化(XOR)に関して、みなさんを意見を聞きたくて書き込みしました。

c言語の初期化で、一般的だと思われるのは
int cnt = 0;
だと思います。

私は学生のころ、ゲームプログラミング(C,C++)を勉強していまして
そのころの講師に、体感では分からないけどXOR初期化の方が早いよと習いました。(何回も初期化する場所や大型のプログラムなら)

その後、初期化に関しては
cnt ^= cnt;
といった形で初期化してきましたが、その後ゲーム関係ではありませんが、
組み込み系の企業に就職した際の研修で、XOR初期化をしていたところ、
XORで初期化をするなと怒られました。

理由としては、見る側が分かりづらいということです。
海外の人たちはXORでの初期化何て分からないと言われまして(//初期化みたいなコメントを付けましたが)それ以降使ってきませんでした。

ふと、そのことを思い出したので他の方々の意見を聞きたい処です。
やはりXOR初期化は余り好まれないのでしょうか?

よろしくお願いします

Re:変数初期化(XOR)に関しての意見

Posted: 2010年7月28日(水) 09:11
by シエル
cnt ^= cnt;ってビット演算だから早いのかな?
この初期化方法は初めて見ました。

単に代入するのとそんなに速度に違いが出るんですかね?
う~ん。勉強になりました。
独り言みたいですいません。。。

Re:変数初期化(XOR)に関しての意見

Posted: 2010年7月28日(水) 10:01
by toyo
その昔アセンブラでプログラムしていた頃
レジスタの初期化で普通に
LD A, 0
のようにしていました(Z80のニーモニックです)
私が最初に買ったSHARPのMZ-1200というパソコンについていたソースコードで
XOR A
の記述を見てそれがAレジスタの初期化とわかり感動した記憶があります
当時は搭載メモリも少なくCPU速度も遅いので1バイトでも短く1クロックでも早くというプログラムが望まれていたのでこのようなテクニックが生み出されたのかなと考えます

今のCコンパイラでしたら0の初期化は最適化されてXORに自動で置き換えられることが多いのではないでしょうか
それなら初期化の目的であえてわかりにくいビット演算を使うのは不適切かと思います

Re:変数初期化(XOR)に関しての意見

Posted: 2010年7月28日(水) 10:39
by たかぎ
アセンブラではよくやる方法ですが、C/C++の場合は意味がありません。
それ以上に、不定値を参照することになるのでよくないでしょう(建前上、トラップ表現の可能性もあるわけですし)。

Re:変数初期化(XOR)に関しての意見

Posted: 2010年7月28日(水) 11:12
by ぜらーちん
みなさんコメントありがとうございます。

最近のコンパイラは優秀ですね…、0の方が分かりやすいのは
色々な人が見るのには確かに、です。

確かに、最初の初期化でやると ??? と ??? をぶつけることになるので
良くなさそうです。

最初の初期化ではなく、0クリアしたい場合には…と考えても
コンパイラがやってくれるのなら0でいいですね。

ポケットコンピュータでBASICをやってたこともあり、
XORが結構馴染んでいたので、使いたい処ですが、
みなさんの意見の通り、やはり0の方が良さそうですね。

有難うございました。

Re:変数初期化(XOR)に関しての意見

Posted: 2010年7月28日(水) 11:43
by たかぎ
あらゆるプロセッサでXOR Aに展開されるならよいのですが、アーキテクチャによっては同じレジスタ同士の演算ができません。
その場合、いったん別のレジスタやメモリに値をコピーし、その上でXORの計算を行うことになりますので、そんなプログラムは大きく、遅いものになってしまいます。

また、XOR Aができるアーキテクチャであっても、型によっては必ずしも効率がよくなるわけではありません。
こういうのはコンパイラに任せるべきですね。

Re:変数初期化(XOR)に関しての意見

Posted: 2010年7月28日(水) 15:48
by softya
アセンブラでは良く見かけますが、高級言語ではまずXORで初期化しているのは見たことないです。
XORだとPICマイコンとかでは確かに効率が悪そうですね。コンパイラに任せるべきだと思います。