Erlang二进制文件:这会导致副本吗?

时间:2013-05-29 13:32:02

标签: erlang internals

阅读this document后,我不确定以下代码是否会在内部生成A的运行时副本二进制文件。

f(<<>>, A) ->
    A;
f(<<X:2/binary, R/binary>>, A) ->
    I = binary_to_integer(X, 16),
    f(R, <<A/binary, I>>).

我的猜测是“不”,因为A没有被发送也没有被解构。我是对的,还是我错过了什么?

2 个答案:

答案 0 :(得分:4)

您的代码不会导致A二进制文件的运行时复制,因为不会共享子二进制文件。如果我们手动展开追加操作序列,它看起来像

A0 = <<A/binary, SomeByte>>,
A1 = <<A0/binary, SomeByte1>>,
A2 = <<A1/binary, SomeByte2>>,
 .....
An = <<An-1, SomeByteN>>.

因此,我们只附加了最新追加操作产生的二进制文件,即只有对A0创建的ProcBin的引用(如效率文档中所述)。

答案 1 :(得分:0)

为什么不使用bin_opt_info选项?

代码:

[root@nimbus bin_test]# erlc +bin_opt_info a.erl
a.erl:8: Warning: OPTIMIZED: creation of sub binary delayed

对于https://gist.github.com/wardbekker/5673200

中的代码

输出结果为:

[root@nimbus bin_test]# erlc +bin_opt_info test.erl 
test.erl:14: Warning: OPTIMIZED: creation of sub binary delayed
[root@nimbus bin_test]# erlc +bin_opt_info test2.erl
test2.erl:8: Warning: variable 'A' is unused
test2.erl:13: Warning: OPTIMIZED: creation of sub binary delayed