为什么在 Ruby 中使用 SecureRandom.uuid 创建的字符串需要 77 个字节?

oni*_*nbo 2 ruby uuid

为什么在 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)

Kon*_*kov 5

如果你看这里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字节),而第一个将实际字符串数据大小添加到其中......