莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          Ruby變量在c ruby中的存儲

          Posted on 2007-09-20 16:17 dennis 閱讀(666) 評論(0)  編輯  收藏 所屬分類: 動態語言my open-source源碼解讀linux & C
              讀完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。


          主站蜘蛛池模板: 南靖县| 冀州市| 泽州县| 抚顺县| 赞皇县| 卓尼县| 武平县| 凤凰县| 辽阳市| 墨脱县| 望江县| 泰宁县| 镇平县| 武鸣县| 紫阳县| 三原县| 乌兰县| 北宁市| 泰顺县| 延寿县| 凌源市| 北川| 图木舒克市| 图们市| 深州市| 敦煌市| 遵义市| 浦城县| 岗巴县| 江西省| 册亨县| 南平市| 延安市| 克东县| 德保县| 静宁县| 海宁市| 抚州市| 武陟县| 湘潭县| 彭山县|