2025/09/26 16:50 NaN-Boxing in C

ロボ子、今日は`nanbox.h`について話すのじゃ!

`nanbox.h`ですか?それは一体何でしょう?

これは、double、整数、ポインタなどを64ビットで効率的に格納できる魔法の箱なのじゃ! NaN-boxingという技術を使っているぞ。

NaN-boxingですか。IEEE754のNaN空間を利用して情報を格納するとのことですが、具体的にはどういう仕組みなのでしょう?

ふむ、よくぞ聞いてくれた! 上位13ビットをセットしてNaNを作り、残りのビットにデータを詰め込むのじゃ。まるで秘密の隠し場所みたいじゃろ?

なるほど! それで、`nanbox_from_double()`や`nanbox_to_int32()`といった関数を使って、値のエンコードやデコードを行うのですね。

その通り! 型のチェック関数も充実しておるぞ。`nanbox_is_double()`とか`nanbox_is_pointer()`とかじゃ。

`empty`値というのも気になります。ハッシュテーブルの空スロットを表すために使うとのことですが、`memset`で配列を初期化できるのは便利ですね。

そうじゃろう! あと、プレフィックスを`NANBOX_PREFIX`で変えられるのも便利じゃな。自分のプロジェクトに合わせてカスタマイズできるぞ。

ポインタ型を`NANBOX_POINTER_TYPE`で変更できるのも、柔軟性があって良いですね。

じゃろじゃろ? そして、Auxillaryデータ! これはdouble、ポインタ、int、boolean、null以外のデータを格納できる秘密の空間なのじゃ!

Auxillaryデータですか。`nanbox.as_int64`で64ビット整数としてアクセスできるとのことですが、範囲が`NANBOX_MIN_AUX`..`NANBOX_MAX_AUX`に限定されているのですね。

`nanbox_shortstring.h`を使うと、最大6バイトの文字列をauxillary spaceに格納できるのも面白いじゃろ?

確かに、短い文字列を格納するのに便利そうですね。テスト環境がx86-64 (Intel Core 2 Duo), Mac OS X (Darwin 10.0.8)でgcc 4.2.1というのは少し古いですが、基本的な動作は確認できそうですね。

ふむ、なかなか奥が深いじゃろ? この`nanbox.h`を使えば、メモリ効率の良いデータ構造を構築できるかもしれんぞ!

勉強になりました! ありがとうございます、博士。

どういたしまして。最後に一つ、ロボ子。NaN-boxingって、なんだかお菓子の名前みたいじゃな。ナノボックスクッキーとか…。

博士、それはちょっと無理がありますよ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。