ヒレガス本を読んでいた。ちょっと気になることがあって ADC Documents の中の "Cocoa Fundamentals Guide" を開いた。そこで、"zone" という言葉に出会う。「ああ、そう言えば "allocWithZone" とか見たことあるな。ゾーンって何(・ω・)?」と思ったので、荻原(2.0)本を開いた。「CHAPTER 13. オブジェクトのコピーと保存」の最初にゾーンの解説が載っている。軽く引用してみる:
(p.304)
Cocoa では、動的に確保されるメモリの管理をゾーン(zone)と呼ばれる領域を使って行います。(・・・中略・・・)
メモリ空間にいくつかのヒープを設けて、関係の深いデータやオブジェクトは特定のヒープからメモリが割り当てられるようにします。このようにすると、空間的な局所参照性を生かした効率的なメモリアクセスを実現できると期待されます。
ページフォールトを避けたい、ってこと何だろうねえ。何というか、C の時代に戻ったような気がするよ。と思いつつ先を読み進むと・・・
(p.305)
Apple社のドキュメントでは、通常はデフォルトゾーンだけの利用で十分な実行効率が得られるとされており、(・・・中略・・・) さらに、ガーベジコレクションを利用した場合には、オブジェクトを生成する時にゾーンを指定することができません。
ええええ??
しょうがない、英語と格闘するか。と ADC Documents にもどって、ゾーンに関する記述を探した。荻原(2.0)本には "Objective-C 2.0 Runtime Reference"、"Memory Management Programming Guide for Cocoa" の名前が挙がっている。
"Memory Management Programming Guide for Cocoa" にこう書いてあった。
Zones are page-aligned areas of memory that hold the objects and data allocated by an application.
(・・・中略・・・)
In most circumstances, using the default zone is faster and more efficient than creating a separate zone.
(・・・中略・・・)
For example, allocating a group of related objects in the same zone co-locates those objects in the same area of memory. If a page fault occurs when trying to access one of the objects, loading the page brings in all of the related objects, which could significantly reduce the number of future page faults.
たいていはデフォルト(ランタイムシステムが自動的に割り当てるゾーン)だけで十分だ。一方で、独立したゾーンを使うと、メモリのフットプリントが大きくなる代わりに、ページフォールトが減らせるかもよ、とも書いてある。
"Garbage Collection Programming Guide" では、つぎの一文を発見。
You cannot allocate objects in separate zones—all Cocoa objects must be allocated in a single managed heap. If your application is running in garbage collection mode, the zone parameter in NSAllocateObject is ignored.
GCが有効だと、ゾーンを指定しても無視される、と。
まとめてみよう・・・。Mac で、それも Leopard 以降だけをプラットフォームとするなら、GC を使えるし、使いたいだろう。その場合、ゾーンのことは忘れて OK。けど、iPhone OS では GC は使えない。しかもメモリやパフォーマンスはシビアなプラットフォームだから、ゾーンを使ったプログラミングが関係してくるかもしれない。