1.9中的新对象结构将一些ivar嵌入到对象中,以便更快地访问:
#define ROBJECT_EMBED_LEN_MAX 3 struct RObject { struct RBasic basic; union { struct { long numiv; VALUE *ivptr; struct st_table *iv_index_tbl; } heap; VALUE ary[ROBJECT_EMBED_LEN_MAX]; } as; };
我的问题是,前3个ivar是否总是嵌入的?或者只有当ivar的数目为<=3时才嵌入它们?
我试着读了源代码,但发现它就在不可理解的旁边。
谢谢
实例变量堆(调用 heap )和嵌入的实例变量(调用 ary )包含在联合中。你还可以在你引用的截图下面找到一些宏,它们看起来都是:
heap
ary
#define ROBJECT_IVPTR(o) \ ((RBASIC(o)->flags & ROBJECT_EMBED) ? \ ROBJECT(o)->as.ary : \ ROBJECT(o)->as.heap.ivptr)
关键是 RBASIC(o)->flags & ROBJECT_EMBED . 这个 ROBJECT_EMBED 标志指示嵌入的实例变量是正在使用中,还是正在使用堆。
RBASIC(o)->flags & ROBJECT_EMBED
ROBJECT_EMBED
因此,只有当实例变量的数目为 <= 3 .
<= 3