CodeTalk 5월 3일에 포스트됨 공유하기 5월 3일에 포스트됨 (edited) 델파이의 String 타입은 "copy-on-write" 즉, 쓰기가 발생할 때 복사된다는 특징이 있어서 메모리를 효율적으로 사용한다. 이 특징을 알아보자. 예를 들면 다음과 같다. 먼저, S1 := '반가워'; 처럼 String 변수에 '반가워' 라는 문자열을 넣으면, '반가워' 라는 실제 데이터는 Heap 메모리에 들어간다. S1이라는 변수의 메모리에는 실제 데이터가 위치한 Heap 메모리의 주소 (예: 53386652)가 들어간다. 이때, '반가워' 라는 데이터를 담고 있는 Heap에는 값 데이터 뿐만 관련된 부가 정보도 담는데 그 중에는 'Reference Count (참조 갯수)' 정보도 있다. 현재, 이 메모리 블록 즉, '반가워'라는 String 데이터 (즉, '반가워')를 사용하고 있는 것은 S1 밖에 없으므로, Reference Count (참조 갯수)는 '1'이다. 이어서, S2 := S1; 처럼 String 변수를 또 다른 변수에 복사(할당)하면, 변수 S2에는 변수 S1에 들어있는 주소와 동일한 주소 즉, 53386652가 들어간다. 이때, '반가워' 라는 데이터를 담고 있는 Heap에 있는 Reference Count (참조 갯수)가 '1' 증가하여 '2'가 된다. 현재, 이 메모리 블록 즉, '반가워'라는 String 데이터 (즉, '반가워')를 사용하고 있는 것은 S1 과 S2, 즉 2 곳이다. 이어서, S2[1] := 'a'; 처럼 같은 String을 가리키던 변수 중 하나가 String 값을 변경하면, Heap에는 '반a워' 라는 새 String 데이터를 담은 메모리 블록이 새로 생긴다. 이 문자열의 Reference Count 는 '1'이다. 변수 S2에는 이 새 메모리의 주소 (예: 53386676)가 담긴다. 변수 S1에는 원래 담겨있던 메모리 주소 즉, 53386652가 그대로 이며, 원래 있던 '반가워' 데이터 역시 Heap 안의 그 위치에 그대로 있다. 다만, Reference Count 가 '2'에서 '1'로 줄어든다. 이제는 S1 만 이 문자열데이터를 참조하고 있기 때문이다. 참고로, 델파이의 String은 더 이상 사용되지 않을 때 메모리에서 자동으로 제거되고 반환되는데, 그 이유는 위와 같이 해당 String을 사용하고 있는 곳의 갯수(참조 갯수)를 관리하기 때문이다. 즉, 참조 갯수가 0이 될 때 그 String은 Heap 메모리에서 제거된다. [예제 소스 ] https://github.com/Codetalk2022/DelphiTraining/blob/main/Object%20Pascal%20Language/String/StringCopyAndMemory/StringCopyAndMemory.dpr [더 알아보기] 델파이의 String 타입을 충분히 이해하고 싶다면, Delphi Object Pascal Handbook (영문, 무료 PDF 다운로드): "06장 All about strings"을 볼 것을 권한다. 위 설명과 예제 역시 이 책에 있는 내용이 바탕이 되었다. Edited 5월 3일 by CodeTalk 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.