±ÍÇÏ´Â ¼Õ´Ô À̽ʴϴÙ
·Î±×ÀÎ
ȸ¿ø°¡ÀÔ
  
  µ¨¸¶´ç °ø½Ä ÀºÇà°èÁÂ
  ÇϳªÀºÇà 227-910235-83607
  ¿¹±ÝÁÖ ÀÌ»ó±¹(¿î¿µÁø)
ÇÁ·ÎÁ§Æ® °Ô½ÃÆÇ
ÅõÇ¥°Ô½ÃÆÇ
µ¨¸¶´ç¼Ò°³
±âÃʺÎÅÍ È°¿ë±îÁö! µ¨ÆÄÀÌ ±³À° - µ¥ºê±â¾î
Áú¹®°ú ´äº¯ Áú¹®°ú ´äº¯ ÀÔ´Ï´Ù.
±Û³»¿ë - Áú¹®°ú ´äº¯
 [´äº¯] String ÇÒ´ç ¹Þ¾Æ¾ß ÇÏ´ÂÁö¿ä??
À强ȣ
(À强ȣ)
2009-11-25 ¿ÀÀü 12:36:39
5902ȸ Á¶È¸


µî·ÏµÈ ÆÄÀÏÀÌ ¾ø½À´Ï´Ù.

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  &