2013-05-29 25 views
2

在讀取this document之後,我不確定以下代碼是否會在內部生成A的運行時副本二進制文件。Erlang二進制:這會導致副本嗎?

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

我的猜測是「否」,因爲A沒有發送,也沒有被解構。我是對的嗎,還是我錯過了什麼?

回答

4

由於沒有共享子二進制文件,您的代碼不會導致運行時複製A二進制文件。如果我們手動展開追加的操作順序,它看起來像

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

所以我們只附加到從最新的追加操作,即所產生的二進制有一個單一的參考ProcBin這對A0創建(如效率文件中所述)。

+2

我已經修改了代碼示例有點和輸出二進制堆加時每個二進制文件的引用計數,確實沒有創建副本。 https://gist.github.com/wardbekker/5673200 –

+0

非常感謝你澄清這一點!感謝您的示例實現! – uuid0

0

爲什麼不使用bin_opt_info選項?

爲您的代碼:

[[email protected] bin_test]# erlc +bin_opt_info a.erl 
a.erl:8: Warning: OPTIMIZED: creation of sub binary delayed 

對於代碼https://gist.github.com/wardbekker/5673200

輸出是:

[[email protected] bin_test]# erlc +bin_opt_info test.erl 
test.erl:14: Warning: OPTIMIZED: creation of sub binary delayed 
[[email protected] 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 
相關問題