代码之家  ›  专栏  ›  技术社区  ›  horseyguy

Ruby1.9中嵌入的实例变量?

  •  1
  • horseyguy  · 技术社区  · 15 年前

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

    我试着读了源代码,但发现它就在不可理解的旁边。

    谢谢

    1 回复  |  直到 15 年前
        1
  •  1
  •   Stéphan Kochen    15 年前

    实例变量堆(调用 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 标志指示嵌入的实例变量是正在使用中,还是正在使用堆。

    因此,只有当实例变量的数目为 <= 3 .

    推荐文章