设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2601|回复: 6
打印 上一主题 下一主题

[讨论] Ruby 1.8(VX) &1.9(ACE) 的 String 的 object_id 与内存

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
163 小时
注册时间
2011-11-12
帖子
56
1
发表于 2012-1-16 00:57:27 | 显示全部楼层
這個可以查 1.9 的 ruby.h,裏面有 RString 的定義(<-- 在頭文件裏進行定義的習慣不好)。
  1. struct RString {
  2.     struct RBasic basic;
  3.     union {
  4.         struct {
  5.             long len;
  6.             char *ptr;
  7.             union {
  8.                 long capa;
  9.                 VALUE shared;
  10.             } aux;
  11.         } heap;
  12.         char ary[RSTRING_EMBED_LEN_MAX + 1];
  13.     } as;
  14. };
复制代码
下面還有一個返回指針的宏:
  1. #define RSTRING_PTR(str) \
  2.     (!(RBASIC(str)->flags & RSTRING_NOEMBED) ? \
  3.      RSTRING(str)->as.ary : \
  4.      RSTRING(str)->as.heap.ptr)
复制代码
[/code]
在 string.c 裏可以看到 Ruby 1.9 是如何分配新字符串的,裏面有這麼一段:
  1.     if (len > RSTRING_EMBED_LEN_MAX) {
  2.         RSTRING(str)->as.heap.aux.capa = len;
  3.         RSTRING(str)->as.heap.ptr = ALLOC_N(char,len+1);
  4.         STR_SET_NOEMBED(str);
  5.     }
复制代码
可見 Ruby 1.9 對較短的字符串作了優化,當字符串長度小於等於 RSTRING_EMBED_LEN_MAX 的時候就直接把字符串嵌入到 RString 這個對象結構裏,而不是重新在堆裏分配內存,避免了頻繁 malloc 小內存塊帶來的內存碎片開銷。當把字符串嵌入 RString 裏的時候,那些堆的信息就不需要了;當在堆中分配字符串的時候,用於嵌入字符串的地址 RString#as.ary 就不需要了,所以才有外部的那個 union。

  1. #define RSTRING_EMBED_LEN_MAX ((int)((sizeof(VALUE)*3)/sizeof(char)-1))
复制代码
這個定義在 Win32 環境下應該總是展開為 11。你不妨試試長一點的字串。

点评

嗯,请问哪里可以查到 ruby.h 和其他的 C/C++ 档案呢?  发表于 2012-1-29 09:51
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
163 小时
注册时间
2011-11-12
帖子
56
2
发表于 2012-1-21 23:20:57 | 显示全部楼层
亿万星辰 发表于 2012-1-21 22:53
在ACE里 ["a","b","c"].to_s 会得到一个很囧的结果……

1.9 行為改變了:
enum.to_s → str
Returns a string representation of enum. (Prior to Ruby 1.9, this representation was the same as enum.join. Now it is the array as a literal.)
[ 1, 3, 5, 7, 9 ].to_s # => "[1, 3, 5, 7, 9]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-13 18:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表