1.9中的新对象结构将一些ivars嵌入到对象中以便更快地访问:
#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个ivars总是被嵌入?或者只有当ivars的数量<= 3时它们才被嵌入?
我已经尝试过阅读源代码,但却发现它不可理解。
由于
答案 0 :(得分:1)
实例变量堆(称为heap
)和嵌入式实例变量(称为ary
)包含在联合中。您还会在所引用的snippit下面找到一些宏,这些宏看起来都像:
#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
标志指示嵌入的实例变量是否正在使用,或者堆正在使用中。
因此嵌入变量仅在实例变量的数量为<= 3
时使用。