[Copy-On-Write 란?]
음...
저도 설명을 잘 못하겠네요..
검색해보시면 많이 나오는데..
객체(구조체,data)를 복사할때
내용이 같으면 실제 data를 복사하지 않고 , 참조(Refrence) 횟수만 증가시켜두구요
어느쪽에서는 내용을 수정(write) 할때 , 새로은 메모리를 확보하여 원본을 복사해 수정하는 방식입니다.
vcl에서 대표적이 것이 바로 String 입니다.
다른 언어에서도 String클래스는 Copy-On-Write방식을 많이 쓰는것 같습니다.(정확히 잘 모름)
이전에 한 퀴즈중에 두 코드의 차이점을 묻는 퀴즈가 있었는데..
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=963
Lyn님 답변에 char *cp가 무효화될 가능성이 있다는 얘기가 바로 위와같은 이유이죠~!
그런데 VCL에는 String 클래스말고 Copy-On-Write 방식의 Class 들이 여럿 더 있는것 같습니다.
[ vcl에서 Copy-On-Write 방식의 class가 어떤것들이 있을까요?]
1. String 클래스
String s1="1234567890";
String s2=s1; //이때 문자열"1234567890" 이 복사되지 않습니다.
//문자열의 RefCount만 증가되지요
s2[1]='a'; //이때 새로운 메모리가 확보되어 문자열이 Copy됩니다.
//원본의 RefCount는 하나 줄어들구요
String s3=s1;
s1="ABCDEFG";// 이때도 s1이 원래 가지고 있던 RefCount는 1 줄어들고 ,
// 원래 문자열 정보는 s3만 가지고 있구
//s1은 새로운 메모리를 확보하여 문자열"ABCDEFG"를 저장해 둡니다.
또 어떤게 있을까요?
미리 말씀드리지만 저도 몇개만 알고있을뿐 다는 모릅니다.
그럼..
|
TBitmap은 주석에 Copy on write라는 단어도 보이네요.
TBitmap은 TBitmapImage, TIcon은 TIconImage 라는 TSharedImage타입의 변수가 사용되고 있습니다.
TSharedImage의 Refrence와 Release 메소드가 Copy-On-Write기법을 사용하도록 도와주고 있습니다.
다른 유닛에도 유사한 방식으로 동작하는 클래스가 있을것으로 보입니다.
혹시나 싶어, VCL 소스 전체를 Copy on write로 검색했는데 주석에 친절하게 설명을 달아놓은건 TBitmap이 유일하네요.