Встроенные переменные экземпляра в Ruby 1.9? - PullRequest
1 голос
/ 06 июля 2010

новая структура объектов в 1.9 встраивает несколько иваров в объекты для более быстрого доступа:

#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 ивара? или они встроены, только если число иваров <= 3? </p>

Я пытался прочитать источник, но нашел его рядом с непонятным.

Спасибо

1 Ответ

1 голос
/ 07 июля 2010

Куча переменных экземпляра (называемая 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...