Elixir/Erlang中字符串的长度和大小需要解释

Elixir/Erlang中字符串的长度和大小需要解释,erlang,elixir,Erlang,Elixir,有人能解释一下为什么s是一个包含4096个字符的字符串吗 iex(9)> s = String.duplicate("x", 4096) ... lots of "x" iex(10)> String.length(s) 4096 但它的内存大小是几6个字 iex(11)> :erts_debug.size(s) 6 # WHAT?! 为什么s2比s短得多 iex(13)> s2 = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17

有人能解释一下为什么
s
是一个包含4096个字符的字符串吗

iex(9)> s = String.duplicate("x", 4096)
... lots of "x"
iex(10)> String.length(s)
4096
但它的内存大小是几6个字

iex(11)> :erts_debug.size(s)
6 # WHAT?!
为什么
s2
s
短得多

iex(13)> s2 = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20"
"1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20"
iex(14)> String.length(s)
50
但是它的大小比
s
多3个单词

iex(15)> :erts_debug.size(s2)
9 # WHAT!?
为什么这些字符串的大小与其长度不匹配


感谢第一条线索,为什么这表明可以在中找到值。引用
size/1
docs:

%% size(Term)
%%  Returns the size of Term in actual heap words. Shared subterms are
%%  counted once.  Example: If A = [a,b], B =[A,A] then size(B) returns 8,
%%  while flat_size(B) returns 12.
第二条线索可以在中找到


因此,在第一种情况下,字符串太大,无法单独放在堆上,因此它使用存储在堆栈上的字符串,而在堆上,只有指向给定二进制文件的指针


在第二种情况下,字符串短于64个字节,它使用的是直接存储在堆中的字节数组,因此每个字
8个字节(64位)*9=72
当我们查看有关VM中确切内存开销的文档时,我们会看到。

同样重要的是要记住,
size/1
计数
堆字
。而且链接非常好。谢谢