Perlテックブログ

ITエンジニアの成長意欲を刺激する技術考察、モジュール開発の日記。Perlイベントや国内や海外のPerlの記事の紹介。

タグ付きポインターというマニアなテクニックを紹介してみる

SPVMの可変長配列の構文は、かなり複雑に膨らみそうな予感がしたので、あきらめ。

今日は、ウィークリファレンスの試験をして、壊れている部分の修正をしてる。

PerlやSPVMは、リファレンスカウント方式のGCで、相互参照あるいは循環参照が起こると、それらのオブジェクトがGCによって回収されない

これを解決するのがウィークリファレンス。

ウィークリファレンス

ウィークリファレンスの実装は、意外と難しい。考え方が難しいのよ。

ウィークリファレンスを管理するには三つの情報がいる。

  1. 弱参照かどうか
  2. リファレンスカウント
  3. どのオブジェクトが弱参照しているかのリスト

では、ここで質問です。

「弱参照かどうか」という情報は、いったいだれが持っているのでしょうか。

1. さす側
2. さされる側












「1. さす側」と答えた方が正解です。2と3は、さされる側が所有している情報です。

weaken $foo->{x}

とした場合に、$foo->{x} 側の情報として1が、xによって表されるオブジェクトの側に2と3の情報があります。

どうやって弱参照の情報保存するのよ?

じゃあ、どうやってその情報保存するのよ? 僕は、悩みました。そもそも、さす側に情報を入れれるのかと。

Perlにはリファレンスというデータ構造があるけれど、SPVMにはないやん。いったいどこに入れたらええのじゃ。

googleで検索しました。そして、情報を発見。

「バイトマシンにおいては、ポインタは、最低でも1バイト単位でアラインメントされます。」

「ですから、mallocで確保される下位の3bitは、常に0のビットが立ちます。」

そうやったんか~!!!

下位の3bitをフラグのように利用したポインタをタグ付きポインタといいます。」

そしたら、ここをフラグに使えるじゃん。やったー。

タグ付きポインターというマニアなテクニックの紹介でした。