为什么用 SecureRandom.uuid in Ruby 创建的字符串占用 77 个字节?
Why does the string created with SecureRandom.uuid in Ruby take 77 bytes?
为什么在 Ruby 2.6.6 中使用 SecureRandom.uuid
创建的字符串正好占用 77 个字节?
irb(main):018:0> ObjectSpace.memsize_of(SecureRandom.uuid)
=> 77
如果我复制并粘贴字符串,它只需要 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
如果你看这里 https://github.com/ruby/ruby/blob/b59077eecf912a16efefc0256f6e94a000ce3888/gc.c#L4066 你可以看到 memsize_of
returns
size + sizeof(RVALUE)
其中 size
计算有点复杂,但您应该能够轻松找到 T_STRING 的正确分支:
size += rb_str_memsize(obj);
反过来,如果你看后者 - https://github.com/ruby/ruby/blob/8c2e5bbf58e562ea410b53c2f77e4186d5ca9da3/string.c#L1404 - 你会看到它 returns 0 或 STR_HEAP_SIZE(str)
- 分配给字符串的实际 space内容。
我不完全理解标志的含义(不太了解 Ruby 内部结构),但我想它们只是对于在运行时创建的文字和字符串有所不同 - 所以你的最后一个案例给出了您只是 RVALUE 本身的大小(40 字节),而第一个将实际字符串数据大小添加到它...
为什么在 Ruby 2.6.6 中使用 SecureRandom.uuid
创建的字符串正好占用 77 个字节?
irb(main):018:0> ObjectSpace.memsize_of(SecureRandom.uuid)
=> 77
如果我复制并粘贴字符串,它只需要 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
如果你看这里 https://github.com/ruby/ruby/blob/b59077eecf912a16efefc0256f6e94a000ce3888/gc.c#L4066 你可以看到 memsize_of
returns
size + sizeof(RVALUE)
其中 size
计算有点复杂,但您应该能够轻松找到 T_STRING 的正确分支:
size += rb_str_memsize(obj);
反过来,如果你看后者 - https://github.com/ruby/ruby/blob/8c2e5bbf58e562ea410b53c2f77e4186d5ca9da3/string.c#L1404 - 你会看到它 returns 0 或 STR_HEAP_SIZE(str)
- 分配给字符串的实际 space内容。
我不完全理解标志的含义(不太了解 Ruby 内部结构),但我想它们只是对于在运行时创建的文字和字符串有所不同 - 所以你的最后一个案例给出了您只是 RVALUE 本身的大小(40 字节),而第一个将实际字符串数据大小添加到它...