在讀取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沒有發送,也沒有被解構。我是對的嗎,還是我錯過了什麼?
在讀取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沒有發送,也沒有被解構。我是對的嗎,還是我錯過了什麼?
由於沒有共享子二進制文件,您的代碼不會導致運行時複製A
二進制文件。如果我們手動展開追加的操作順序,它看起來像
A0 = <<A/binary, SomeByte>>,
A1 = <<A0/binary, SomeByte1>>,
A2 = <<A1/binary, SomeByte2>>,
.....
An = <<An-1, SomeByteN>>.
所以我們只附加到從最新的追加操作,即所產生的二進制有一個單一的參考ProcBin這對A0
創建(如效率文件中所述)。
爲什麼不使用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
我已經修改了代碼示例有點和輸出二進制堆加時每個二進制文件的引用計數,確實沒有創建副本。 https://gist.github.com/wardbekker/5673200 –
非常感謝你澄清這一點!感謝您的示例實現! – uuid0