NaN-boxingの話の前に。。。
javascriptの変数を表現する構造を書こう!
素朴に実装すると、
enum type { DOUBLE, INT, OBJECT, ... }; struct jsvalue { enum type type; union { double uDouble; int uInt; void *uObject; ... } value; };
環境によるけれど少なくとも64ビットより大きいアロケーションが必要
double型のNaNを利用して、変数のアロケーションを64ビットに収めるテクニック
NaNは
指数部の各ビットがすべて1で、仮数部が0でない数
それってつまり、、、
doubleの表現する2^52ものパターンがNaNになる!
NaN-boxing実装で考えること
ちょっと待った!
64ビット環境だとポインタのサイズ64ビットだからNaN-boxingできなくね?
64ビット環境でもNaN-boxingできる!
ときがあります。