2013-05-29 4 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 바이너리의 런타임 복사를 가져 오지 않습니다. 우리가 수동으로 APPEND 작업의 순서를 풀다 경우는 A0 생성 된 ProcBin에 대한 단일 참조가 (이

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

같은 그래서 우리는 즉 최신 추가 작업에서 발생하는 바이너리에 추가되어 보이는 효율성 문서에서 설명 된대로).

+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