Part 14.メモリレイアウト(7)


さて、「クリアする」という部分に焦点を絞っていこう。


以前、あるマジシャンが「東京タワーを消す」というマジックを披露した。ネタは簡単だ。最初にビルの屋上で、机と椅子に腰掛けてランチをしている親子と一緒に東京タワーを撮影する。実はその親子はエキストラで、次に、カメラを30度ほどその場で回転させたあと、その「机と椅子と腰掛けてランチをしている親子」をカメラの回転に相当する分だけ回転移動させ、撮影する。このとき、東京タワーはカメラに写りこまないようにする。


最初に撮った映像と後にとった映像とを比較すれば東京タワーは消えたように見える。そりゃ東京タワーを移動させるより、カメラとその周辺のものだけを移動させるほうがコストがかからないので、こうするのが賢い。


「文字列をクリアする」場合にも、同じことが言える。文字列長を収めている変数(Length)を用意しているので、文字列本体を収めている変数(StringBody)をクリアしなくともLengthにゼロを代入するだけで文字列として全体をみるならばそれはクリアされている。これは、東京タワーを消すマジックより驚愕に値する。何しろ、たった一つの変数にゼロを代入するだけで何バイトもの配列をzero fillしたのと同じ効果が得られるのだから!


Lengthではなく場合によっては単に「クリアされているかどうか」を表すだけの1ビットのフラグであっても良い。


bool isClear;
このたった1ビットのメモリをリセットするだけで、何千万ビットというメモリをzero fillしたのと同じ効果が得られるというのは感動ものだ。


そして、これは(実用上は全く役に立たない)マジックや小手先のテクニックの類では無い。本当に、こういう努力によってプログラムの速度が劇的に改善される。(ことがある。)


だからプログラミングの入門書は、こういう大切なことを真っ先に書くべきだと思う。一見、当たり前の事実のようだが、全然当たり前のことではないのだから。


(つづく)