12.1. 装箱
Lean 值在运行时可以用两种方式表示:
-
装箱值可能是指向堆中值的指针,也可能需要通过移位和掩码才能取得。
-
非装箱值可以直接取得。
装箱值要么是指向对象的指针,此时最低位为 0;要么是立即值,此时最低位为 1,将其表示右移一位即可得到该值。
采用非装箱表示的类型(例如 UInt8 和枚举归纳类型),在编译器能够确定值具有相应类型的上下文中,会表示为对应的 C 类型。
在某些上下文中(例如 Array 这样的泛型容器类型),原本采用非装箱表示的值必须先装箱才能存储。
换言之,由于枚举归纳类型 Bool 采用非装箱表示,调用 Bool.not 时传入和返回的都是非装箱的 uint8_t 值;但 Array Bool 中的各个 Bool 值则是装箱的。
归纳类型构造器中类型为 Bool 的字段采用非装箱表示,而多态字段实例化为 Bool 后,其中存储的 Bool 则采用装箱表示。