Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

델파이에서 문자열을 복사 또는 변경할 때 메모리가 사용되는 방식 (copy-on-write 특징)


Recommended Posts

델파이의 String 타입은 "copy-on-write" 즉, 쓰기가 발생할 때 복사된다는 특징이 있어서 메모리를 효율적으로 사용한다. 이 특징을 알아보자.

예를 들면 다음과 같다.

  1. 먼저, S1 := '반가워'; 처럼 String 변수에 '반가워' 라는 문자열을 넣으면,
    • '반가워' 라는 실제 데이터는 Heap 메모리에 들어간다.
    • S1이라는 변수의 메모리에는 실제 데이터가 위치한  Heap 메모리의 주소 (예: 53386652)가 들어간다.
    • 이때, '반가워' 라는 데이터를 담고 있는 Heap에는 값 데이터 뿐만 관련된 부가 정보도 담는데 그 중에는 'Reference Count (참조 갯수)' 정보도 있다. 
      현재, 이 메모리 블록 즉, '반가워'라는 String  데이터 (즉, '반가워')를 사용하고 있는 것은  S1 밖에 없으므로,  Reference Count (참조 갯수)는 '1'이다.
  2. 이어서, S2 := S1; 처럼 String 변수를 또 다른 변수에 복사(할당)하면,
    • 변수 S2에는 변수 S1에 들어있는 주소와 동일한 주소 즉, 53386652가 들어간다.
    • 이때, '반가워' 라는 데이터를 담고 있는 Heap에 있는 Reference Count (참조 갯수)가 '1' 증가하여 '2'가 된다.
      현재, 이 메모리 블록 즉, '반가워'라는 String  데이터 (즉, '반가워')를 사용하고 있는 것은 S1 과  S2, 즉 2 곳이다.
  3. 이어서,  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 메모리에서 제거된다.

[예제 소스 ]

[더 알아보기]

Edited by CodeTalk
이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.