为什么在 Ruby 2.6.6 中创建的字符串SecureRandom.uuid正好占用 77 个字节?
irb(main):018:0> ObjectSpace.memsize_of(SecureRandom.uuid)
=> 77
Run Code Online (Sandbox Code Playgroud)
如果我复制并粘贴该字符串,则只需要 40。
irb(main):021:0> SecureRandom.uuid
=> "bfd59b9c-3248-409f-bcba-2df11df62c13"
irb(main):022:0> ObjectSpace.memsize_of("bfd59b9c-3248-409f-bcba-2df11df62c13")
=> 40
Run Code Online (Sandbox Code Playgroud)
如果你看这里https://github.com/ruby/ruby/blob/b59077eecf912a16efefc0256f6e94a000ce3888/gc.c#L4066你可以看到,memsize_of返回
size + sizeof(RVALUE)
Run Code Online (Sandbox Code Playgroud)
其中size计算有点复杂,但您应该能够轻松找到 T_STRING 的正确分支:
size += rb_str_memsize(obj);
Run Code Online (Sandbox Code Playgroud)
反过来,如果您查看后者 - https://github.com/ruby/ruby/blob/8c2e5bbf58e562ea410b53c2f77e4186d5ca9da3/string.c#L1404 - 您将看到它返回 0 或STR_HEAP_SIZE(str)- 为字符串内容分配的实际空间。
我不完全理解标志的含义(不太了解 Ruby 内部结构),但我想它们只是在运行时创建的文字和字符串不同 - 所以你的最后一个案例只给你 RVALUE 本身的大小(40字节),而第一个将实际字符串数据大小添加到其中......
| 归档时间: |
|
| 查看次数: |
270 次 |
| 最近记录: |