705
魔獸
Ruby變量在c ruby中的存儲
讀完ruby hacking guide第6章,徹底總結下:
1.在Ruby中,類也是一個對象,因此有實例變量。類的實例變量、類變量、常量都是存儲在RClass struct的iv_tbl中,
struct RClass {
struct RBasic basic;
struct st_table *iv_tbl;
struct st_table *m_tbl;
VALUE super;
};
iv_tbl的類型是st_table,我在這裏用java實現了一下。
2.用戶自定義類的對象(ruby層次聲明的類的對象)的實例變量存儲在RObject struct的iv_tbl中,
struct RObject {
struct RBasic basic;
struct st_table *iv_tbl;
};
調用方法,本質上是一個查表操作。buildin的幾個類,比如String、Array、Hash等(在c層次上實現的類),它們的結構並沒有iv_table,這是從節省內存空間的角度考慮,它們的實例變量存儲在一張全局的st_table中。這張表比較特別,其中的每一個對應的值又是一個st_table,也就是一個“二元結構”,第一層結構是類名與實例變量表的映射,第二層才是實例變量名與實際值的映射。
3.全局變量存儲在一張全局的st_table中,這個表的鍵就是變量名ID,由於全局變量允許通過alias來設置別名,因此這張全局表中真正存儲的是下麵這個struct
334 struct global_entry {
335 struct global_variable *var;
336 ID id;
337 };
324 struct global_variable {
325 int counter; /* 引用計數 */
326 void *data; /* 變量值 */
327 VALUE (*getter)(); /* 取值函數 */
328 void (*setter)(); /* 設置函數 */
329 void (*marker)(); /* 標記函數 */
330 int block_trace;
331 struct trace_var *trace;
332 };
(variable.c)
當不同變量名(通過別名聲明)指向的是同一個全局變量,其實它們指向的是同一個struct global_variable。
文章轉自莊周夢蝶 ,原文發布時間 2007-09-20
最後更新:2017-05-18 10:32:55