Ruby 1.9中的嵌入式实例变量?

时间:2010-07-06 13:00:43

标签: ruby

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时它们才被嵌入?

我已经尝试过阅读源代码,但却发现它不可理解。

由于

1 个答案:

答案 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_EMBEDROBJECT_EMBED标志指示嵌入的实例变量是否正在使用,或者堆正在使用中。

因此嵌入变量仅在实例变量的数量为<= 3时使用。