Fixnum 类表示小整数,由 INT2FIX 得到。由于可能在程序中频繁使用,将其用结构体表示可能会使执行速度大打折扣,因此直接嵌入 VALUE 中。数值左移一位或上0x01使得 Fixnum总是一个奇数,其实际可用比特位为 sizeof(long)*8-1 ,可表示的最大最小值分别为FIXNUM_MAX 和 FIXNUM_MIN ,超出该范围的数属于 Bignum 类,由C结构体实现。
Ruby里面的String、Array等类型,传递到C里面,也是一个双数的指针,这样就可以区别变量类型了
Ruby里面的Integer变量,到了C里面,都会变成单数,双数用来定义false、true、nil等特殊的类型,这样就可以区别nil、false、true和普通的Integer。
不过,这样子的话。32位的有符号整数,去掉了一半用来存这仅仅4个类型,Ruby这样做,是不是很失败呢。
而且。取值范围也减少了一半。
VALUE 最低有效位如果为 1,则为 Fixnum,Fixnum 的值存储在其余 31 位中,故右移一位可得。
Symbol 也是直接值,但却是用的最低有效字节(8 个位)来标识。
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |