【发布时间】:2020-03-18 15:29:55
【问题描述】:
似乎没有简单的方法来获取非字符串数据的字节大小?如果我想知道列表、布尔值、整数、浮点数等的字节大小,我应该使用什么库?
【问题讨论】:
-
什么意思?如果您从c++ 标准库中引用
vector::capacity()之类的东西,那么问题将是为什么 你需要它?答案将取决于您的需要,因为内存在术语和两个列表之间广泛共享,共享尾部,将共享尾部的内存。
似乎没有简单的方法来获取非字符串数据的字节大小?如果我想知道列表、布尔值、整数、浮点数等的字节大小,我应该使用什么库?
【问题讨论】:
vector::capacity() 之类的东西,那么问题将是为什么 你需要它?答案将取决于您的需要,因为内存在术语和两个列表之间广泛共享,共享尾部,将共享尾部的内存。
TL;DR 没有“术语的字节大小”之类的东西。
由于不可变性,erlang 和 elixir 在堆中为某些对象共享内存。请参阅下面的示例。
根据您要查找的内容,此答案可能会有所不同。
:erlang.term_to_binary/1 + :erlang.byte_size/1
:erlang.term_to_binary/1返回一个二进制数据对象,它是根据 Erlang 外部术语格式对Term进行编码的结果。:erlang.byte_size/1返回一个整数,它是包含Bitstring所需的字节数。
> [1] |> :erlang.term_to_binary() |> :erlang.byte_size()
#⇒ 5
:erlang.external_size/1在不进行编码的情况下计算以 Erlang 外部术语格式编码的术语的最大字节大小。
> :erlang.external_size [1]
#⇒ 5
:erts_debug.size/1返回实际堆字中
Term的大小。共享子项只计算一次。示例:If A = [a,b], B = [A,A]然后size(B)返回8,而flat_size(B)返回12。
> :erts_debug.size [1]
#⇒ 2
考虑以下示例。
t1 = {1, 2}
m1 = %{a: t1}
m2 = %{a: t1}
:erts_debug.same(m1.a, m2.a)
#⇒ true
也就是说,一旦为t1 和m1 分配了内存,m2 将引用现有对象并且不再分配(除了标记引用) 会发生。
总而言之,需要了解他们对什么size感兴趣。
【讨论】: