2007ÀÌÇÏÀÇ AnStringÀ¸·Î ¼³¸íµå¸®°Ú½À´Ï´Ù.
...
VCLÀÇ StringÀº reference°¡ countµË´Ï´Ù.
StringÀº º¯¼ö´Â ±×³É Æ÷ÀÎÅÍ 4ByteÀÔ´Ï´Ù.
±×·±µ¥ 4Byte¿¡ ÀûÈù addressÀ§Ä¡¿¡ °¡ º¸¸é ½ÇÁ¦data°¡ ÀÖÁÒ
procedure TForm1.Button1Click(Sender: TObject);
var
s: AnsiString;
begin
s:='abcd';
ShowMessage(IntToStr(sizeof(s))); //'4'
ShowMessage(IntToStr(sizeof(AnsiString))); //'4'
end;
¹¿ Äڵ忡¼ sÀÇ size³ª AnsiStringÀÇ Å©±â´Â 4ÀÔ´Ï´Ù.
Áï Stringº¯¼ö´Â Æ÷ÀÎÅÍÀÌÁÒ
½ÇÁ¦ Data°¡ ±â·ÏµÈ À§Ä¡ÀÇ ¸Þ¸ð¸® ÁÖ¼Ò(Address)°¡ ÀûÈù °ÍÀÔ´Ï´Ù.
[AnsiStirngÀÇ ½ÇÁ¦ ±â·Ï ±¸Á¶]
±×·¸´Ù¸é Stringº¯¼ö°¡ °¡Áö°í ÀÖ´Â AddressÀ§Ä¡¿¡´Â ¾î¶»°Ô ±â·ÏµÇ¾îÀÖÀ»±î¿ä?
AllocSize = ( StrRec+ ½ÇÁ¦ Data ) ±îÁöÀÇ Å©±â°¡ ±â·ÏµÇ¾îÀÖ½À´Ï´Ù.
RefCount = ¸»±×´ë·Î reference-Count ·Î AnsiStringº¯¼ö°¡ ÂüÁ¶ÇÏ°í ÀÖ´Â ¼ýÀÚÀÔ´Ï´Ù.
Length = ½ÇÁ¦DataÀÇ ±æÀÌÀÔ´Ï´Ù.
StringÀÇ ±æÀ̸¦ ±¸ÇÒ¶§..
Delphi(VCL)ÀÇ AnsiStringÀÌ LenthÇÔ¼ö°¡ c¿¡¼ strlenº¸´Ù ¼Óµµ°¡ ºü¸¥µ¥..
AnsiStirngÀÇ Length¸¦ ±¸Çϸé À§¿¡ StrRec±¸Á¶Ã¼¿¡¼ Length°ªÀ» ±×³É returnÇÏÁö¸¸
c¿¡¼ strlenÀº $0 Áï NULL¹®ÀÚ°¡ ³ªÅ¸³¯¶§±îÁö óÀ½ºÎÅÍ °è¼Ó searchÇÕ´Ï´Ù.
±×·¡¼ AnsiStringÀÇ Length°¡ cÀÇ strlenº¸´Ù ¼Óµµ¸¦ ºñ±³ÇÒ¼ö ¾øÀ» Á¤µµ·Î ºü¸£ÁÒ
ÂüÁ¶ http://cafe.naver.com/bcbmaster/850
RefCount´Â ¾î¶»°Ô ...
var
s1,12: Stirng;
begin // 1)
s1:='abcd'; // 2)
s2:=s1; // 3)
s2[1]='k'; // 4)
end; // 5)
À§ ¼Ò½º¿¡¼ 1) ~ 4) °úÁ¤À» ¼³¸íÇص帮¸é...
1) AnsiStringÀ» ¼±¾ðÇÏ¸é ½ºÅÿ¡ 4Byte ¾¿ 2°³ º¯¼ö°¡ ÇÒ´çµË´Ï´Ù.
¹®·Ð ³»¿ëÀº nil ¾Æ¹«°Íµµ ¾ø½À´Ï´Ù.
2) heap(Èü)¿¡ strrec(12Byte)Æ÷ÇÔÇÏ¿© ½ÇÁ¦ data 4Byte±îÁö ÃÑ 16Byte°¡ ÇÒ´çµË´Ï´Ù.
AllocSize = 16
RefCnt = 1
Length = 4
data = 'abcd'
À§¿Í°°ÀÌ ¸Þ¸ð¸®¿¡ ±â·ÏµÇ°í stack¿¡ s1À§Ä¡¿¡´Â DataÀ§Ä¡ÀÇ address°¡ ±â·ÏµË´Ï´Ù.
3) s2:=s1 Çϸé
RefCnt = 2 ·Î ¹Ù²î°í
S2º¯¼ö°¡ ÀÖ´Â stackÀ§Ä¡¿¡ Data°¡ s1°ú ¶È°°Àº °ª DataÀ§Ä¡ÀÇ addrÀÌ ±â·ÏµË´Ï´Ù.
4) s2ÀÇ °ªÀÇ ÀϺθ¦ º¯°æÇϸé
* s1ÀÇ °¡¸®Å°´ø StrRecÀÇ RefCnt =1 ·Î ¹Ù²ò´Ï´Ù.
* ±×¸®°í ´Ù½Ã ¶Ç´Ù¸¥ Èü¿¡ 14+8=22ByteÀÇ ¸Þ¸ð¸®°¡ È®º¸µÇ°í ´ÙÀ½°ú °°ÀÌ ³»¿ëÀÌ ±â·ÏµË´Ï´Ù.
AllocSize = 22
RefCnt = 1
Length = 4
data = 'kbcd' //½Çµ¥ÀÌŸ 5ByteÀε¥.. 4ÀÇ ¹è¼ö·Î ÇÒ´çµÇ¾î¼ 8Byte°¡ ÇÒ´çµÊ
* ±×¸®°í s2ÀÇ stackÀ§Ä¡°ªÀº »õ·ÎÇÒ´çµÈ dataÀÇ Èüaddress°¡ ±â·ÏµË´Ï´Ù.
À½.. ±×¸®°í AllocSize°¡ ¿Ö 12+data_length°¡ ¾Æ´Ï¶ó 14+data_lengthÀÎÁö´Â Àúµµ Á¤È®ÇÑ ÀÌÀ¯¸¦ Àß ¸ð¸£°Ú³×¿ä
...
5) ÇÔ¼ö¸¦ ºüÁ®³ª°¡¸é stack¿¡ ÇÒ´çµÈ s1 , s2 °¡ »èÁ¦µÇ°ÚÁÒ
stringº¯¼ö°¡ »èÁ¦ µÉ¶§´Â RefCnt°¡ Çϳª¾¿ ÁÙ¾îµì´Ï´Ù.
¸¸¾à RefCnt°¡ 0ÀÌ µÉ¶§¸é ¸Þ¸ð¸®¿¡ ÇÒ´çµÈ StrRecºÎÅÍ Data±îÁö ¸ðµÎ freeµË´Ï´Ù.
¸¸¾à Àü¿ªº¯¼ö¿¡ ¹®ÀÚ¿À» ÇÒ´çÇϸé
Àü¿ªº¯¼öÀÇ ³»¿ëÀ» ¹Ù²ÙÁö ¾ÊÀºÇÑ RefCnt´Â ÇÁ·Î±×·¥ÀÌ Á¾·áÇÒ¶§±îÁö Ç×»ó 1º¸´Ù Å©°ÚÁÒ
2009À̻󿡼´Â StringÀ¸·Î ¼±¾ðÇϸé UnicodeStringÀ» °¡¸®Å°´Â°É·Î ¾Ë°íÀÖ½À´Ï´Ù.
2009À̻󿡼 AnsiString°ú UnicodeStringÀº ¾î¶² ±¸Á¶·Î µÇ¾îÀÖ´ÂÁö´Â À߸𸣰ڽÀ´Ï´Ù¸¸..
±âº»ÀûÀÎ ¿ø¸®´Â °°½À´Ï´Ù.
vcl¿¡¼ ÀÌ·± Refrence±¸Á¶¸¦ °¡Áø°ÍÀÌ String»ÓÀÎÁÙ ¾Ë¾Ò´Âµ¥...
ÇÑ°¡Áö ´õÀÖ´õ±º¿ä
ÆÁ°Ô½ÃÆÇ¿¡ ¾ó¸¶Àü¿¡ ¿Ã¶ó¿Â ±ÛÀä
TGraphicÀÌ ±×·± ±¸Á¶·Î µÇ¾îÀÖ´õ±º¿ä
var
bmp1 , bmp2: TBitmap
begin
...
bmp1.LoadFromFile(..);
bmp2.Assign(bmp1); // ¿©±â¼ bmp1ÀÇ imagedata°¡ »õ·Î ÇÒ´çµÇ¾î¼ bmp2¿¡ µé¾î°¡´Â°ÍÀÌ ¾Æ´Õ´Ï´Ù.
http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=0&st=&keyword=&indx=417281&keyword1=&keyword2=&page=1
±×³É bmp1ÀÌ °¡Áö°í ÀÖ´Â imageDataÀÇ address¸¸ copyµË´Ï´Ù.
¸¸¾à bmp1À̵ç bmp2ÀÌµç ¾î´ÀÂÊÀÌµç ³»¿ëÀ» ¼öÁ¤ÇϰԵǸé
¼öÁ¤ÇÑÂÊ¿¡¼ »õ·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ¿©¼ ³»¿ëÀ» º¹»çÇÏ°í º¹»çÇÑ°÷¿¡¼ ¼öÁ¤ÇÕ´Ï´Ù.
Âü ÇÑ°¡Áö
AnsiStirngÀ» ¹è¿·Î Á¢±ÙÇϸé
s: Stirng;
s[1]='x'; ÀÌ·±½ÄÀ¸·Î ³»¿ë¿¡ Á¢±ÙÇÒ¶§
ÀϹÝÀûÀÎ ¹è¿¿¡ Á¢±ÙÇϵíÀÌ Á¢±ÙÇÏÁö ¾Ê½À´Ï´Ù.
SystemÀ¯´ÖÀÇ stirng°ü·Ã ó¸® À¯´ÖÄڵ尡 µ¹¾Æ°©´Ï´Ù.
ÇÁ·ÎÁ§Æ® ¿É¼Ç¿¡¼ Use Debug DCUs¸¦ üũÇϽñ¸
ÄÄÆÄÀÏ ÇÏ¿©¼ À§¿Í°°Àº Äڵ忡¼ break-point°É±¸.. F7À» Ŭ¸¯Çϼż vcl¼Ò½º¾ÈÂÊÀ¸·Î µð¹ö±ëÇØ µé¾î°¡º¸¸é
´ÙÀ½°ú °°Àº System.pas¿¡ ÀÖ´Â Äڵ带 Ÿ°Ô µË´Ï´Ù.
procedure _UniqueStringA(var str: AnsiString);
asm
JMP InternalUniqueString
end;
function InternalUniqueString(var str): Pointer;
asm
{ -> EAX pointer to str }
{ <- EAX pointer to unique copy &