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できる!
ときがあります。