yaneudoujou

Part 16.メモリレイアウト(9)

■ 論理的なクリアの手法 ・可変長配列可変長配列の場合、配列のサイズ(どこまで使用しているのか)をどこかに格納しておき、そのサイズを0にすることにより論理的なクリアが出来る。さきほどから何度も出てきている文字列のクリアも同様である。 このとき配列…

Part 15.メモリレイアウト(8)

いま、普通のzero fillによるクリアとこのクリアとの違いを明確にするため、「文字列本体をzero fillする」手法を「物理的なクリア」と呼び、Lengthにゼロを代入することによりクリアする手法を「論理的なクリア」と呼ぶことにしよう。 物理的なクリアは目に…

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

さて、「クリアする」という部分に焦点を絞っていこう。 以前、あるマジシャンが「東京タワーを消す」というマジックを披露した。ネタは簡単だ。最初にビルの屋上で、机と椅子に腰掛けてランチをしている親子と一緒に東京タワーを撮影する。実はその親子はエ…

Part 13.メモリレイアウト(6)

「プログラマは自分で好きなようにルールを作ることが出来る」とは言っても最低限守らなければいけないことはある。ゲーデルの不完全性定理を持ち出すまでもなく、ルールは無矛盾(consistent)でなければならない。(これについての哲学的な問題は、柄谷 行人…

Part 12.メモリレイアウト(5)

結局、プログラマは自分で好きなようにルールを作ることが出来る。メモリの使用のされ方について好きなように設計できる。頭のなかでルールを思い描いたあとは、実際にそのルールに基づいてコードを書いていけば良い。 頭のなかで思い描いた様子がコードとし…

Part 11.メモリレイアウト(4)

ushort Length; UCS2 StringBody[31];ただし、結局のところ、上のようにたかが2行のコードであっても必ず相手に伝わるとは限らない。 このたった2行のコードですら、暗黙的に読み手のプログラマの経験や知識に頼っているからだ。

Part 10.メモリレイアウト(3)

しかし、第三者からしてみれば、UCS2 moji[32]の先頭の2バイトが文字列長を表していて、格納できる文字列の最大長は31文字だなんて想像がつくだろうか? 出来ることならそういう特殊なルールを定めるべきではないし、特殊なルールを定めたならばそれを可能な…

Part 9.メモリレイアウト(2)

いま、文字列長を表現するfieldを追加したとしよう。 class UCS2String { typedef ushort UCS2; ushort Length; UCS2 moji[32]; } この文字列をクリアするにはどうすれば良いだろうか? moji[32]すべてをzero fillする必要はない。単にLength に 0 を代入す…

Part 8.メモリレイアウト(1)

いま、UCS-2で32文字を格納するために64byteを確保したとしよう。 この確保されたバッファに本当に文字が32文字格納されている保証はどこにもない。 むしろ、そこにUCS-2で格納されている保証すらない。すべて0かも知れない。 typedef ushort UCS2; UCS2 moj…

Part 7.変数の定義域(7)

一般的に前判定で書くのが辛いということがわかれば、変数の定義域をわざとある程度余裕を持たせておく、というのは現実的なプログラミングだと言える。 たとえば、通常、byteの範囲しか取らないとしても、これをintで計算する価値は十分にある。たとえば、…

Part 6.変数の定義域(6)

do { do_something(); // ループ脱出条件にかかわる何らかの演算 // (ただしこのループ脱出後に、ここでの演算結果を用いることは // ないものとする。)} while (!success);言うまでもなく、これは後判定である。これを前判定に書き換えることは難しい。do_s…

Part 5.変数の定義域(5)

ちょっと用語が紛らわしかったようで、補足から入りたい。 私の「前判定」「後判定」と呼んでいるのは、for(int i=0;i

Part 4.変数の定義域(4)

前回、ループの条件は後判定になることが多いということについて書いた。 いま、次の列挙体について考えてみよう。enum A { x,y,z };列挙体Aすべての要素に対して何らかのアクションを行ないたいとする。foreach構文のようなものがあれば良いのだが、不運に…

Part 3.変数の定義域(3)

for文にせよ、while構文にせよ、条件を満たすまでループを行なうためのものである。 たとえば以下のループ構文について考えてみよう。 while ( a<=p && p<= b) 変数pが区間[a,b]の範囲にある間、ループする。もう少し違う言い方をすれば、この区間[a,b]を集…

Part 2.変数の定義域(2)

前回、uintとintの違いについて述べたが、uintを使いなさいという意味ではない。違いを意識しなさいということだ。 たとえば個数を表す変数を用意したとしよう。個数はマイナスになることはないから、uintにするのが、正しい。ときどき、わざわざintで引数と…

Part 1.変数の定義域(1)

最近、他人のソースをコードレビューする機会が増えて、もう同じことを言うのがいい加減疲れてきたので、ひとまとめにして公開していくことにしたい。 今回は整数型変数についてだ。話を簡単にするためint型は32bit符号あり,uint型は32bit符号なし、shortは1…