3Àå. ¸Þ¸ð¸® ÇÒ´ç
GNU üÁ¦´Â ÇÁ·Î±×·¥ »ó¿¡¼ ºÐ¸íÇÏ°Ô ÅëÁ¦ÇÏ´Â ¹æ½ÄÀ¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ´Â ¸î°¡Áö ¹æ¹ýÀ» Á¦°ø ÇÑ´Ù. ±×°ÍµéÀº ÀϹݼº°ú À¯È¿¼ºÀÇ ¹üÀ§ ³»¿¡¼ º¯ÈÇÑ´Ù.
o malloc ÇÔ¼ö´Â ÀϹÝÀûÀÎ µ¿Àû ¸Þ¸ð¸®¸¦ ÃæºÐÈ÷ È®º¸ÇÑ´Ù. 3.3 [Á¦ÇѾø´Â ÇÒ´ç], 22ÂÊ ÂüÁ¶.
o ´Ù¸¥ ÇÔ¼ö·Î´Â obstackÀÌ Àִµ¥,À̰ÍÀº mallocº¸´Ù´Â ´ú ÀϹÝÀûÀÌÁö¸¸ ½ºÅà ÇÒ´ç¿¡¼´Â ÈξÀ ´õ Æí¸®Çϰí À¯¿ëÇÏ´Ù. 3.4 [Obstacks],28ÂÊ ÂüÁ¶.
o ÇÔ¼ö alloca´Â ÀúÀå¼Ò¸¦ µ¿ÀûÀ¸·Î ÇÒ´çÇϰí ÀÚµ¿ÀûÀ¸·Î ÇØÁ¦ÇØ ÁØ´Ù. 3.5 [ÀÚµ¿ÀûÀÎ Å©±â º¯È],36Á· ÂüÁ¶.
3.1 µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ̶õ?
µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ̶õ ÇÁ·Î±×·¥ÀÌ ¾î¶² Á¤º¸¸¦ ¾îµð¿¡ ÀúÀåÇØ³õ°í ½ÇÇàµÉ °ÍÀΰ¡¸¦ °áÁ¤ÇÏ´Â ±â¹ý ÀÌ´Ù. µ¿Àû¸Þ¸ð¸®´Â ´ç½ÅÀÌ ÀÛ¾÷ÇÏ´Â µ¥ÀÌÅͰ¡ ¸Þ¸ð¸® ºí·°À» ¸î °³³ª ÇÊ¿ä·Î ÇÏ´ÂÁö ¶Ç´Â ±× ¸Þ¸ð ¸®µéÀ» ¾ó¸¶µ¿¾È »ç¿ëÇÒ °ÍÀÎÁö¿¡ µû¶ó ¿ä±¸µÈ´Ù.
¿¹¸¦ µé¸é, ´ç½ÅÀÌ ÀÔ·ÂÆÄÀÏ¿¡¼ ÀоîµéÀÎ ÇÑ °³ÀÇ ¶óÀÎÀ» ÀúÀåÇÏ·Á¸é ÇϳªÀÇ ºí·°À» ÇÊ¿ä·Î ÇÑ´Ù; ±×·±µ¥,ÇÑ °³ÀÇ ¶óÀÎÀÌ ¾î´À Á¤µµÀÇ ±æÀÌ·Î µÇ¾î¾ß ÇÏ´ÂÁö°¡ Á¦ÇÑÀÌ ¾øÀ¸¹Ç·Î,´ç½ÅÀº ÀúÀå¼Ò¸¦ µ¿Àû À¸·Î ÇÒ´çÇÒ ¼ö ¹Û¿¡ ¾øÀ¸¸ç,±×°ÍÀ» ´ç½ÅÀÌ ´õ Å« ¶óÀÎÀ» Àоîµé¿´À» ¶§º¸´Ùµµ ´õ Å©°Ô ÇÒ´çÇØ¾ß¸¸ ÇÑ´Ù.
¶Ç´Â,´ç½ÅÀÌ ÀÔ·Â µ¥ÀÌÅÍ¿¡¼ ¸¸µç °¢ ·¹Äڵ峪 Á¤ÀǸ¦ À§Çؼ ÇÑ ºí·°À» ÇÊ¿ä·Î Çϱ⵵ ÇÑ´Ù;±×·± µ¥,´ç½ÅÀÌ »çÀü¿¡ ±×°ÍÀÌ ¾ó¸¶³ª ¸¹À»Áö¸¦ ¸ð¸¦ ¼ö ÀÖÀ¸¹Ç·Î,°¢°¢ÀÇ ·¹Äڵ峪 Á¤Àǰ¡ ÀÏÇôÁú ¶§¸¶´Ù »õ·Î¿î ºí·°À» ÇÒ´çÇØ¾ß¸¸ ÇÑ´Ù.
´ç½ÅÀÌ µ¿Àû ¸Þ¸ð¸®¸¦ ÇÒ´çÇÒ ¶§¿¡´Â ¸Þ¸ð¸® ÇÑ ºí·°À» ÇÒ´çÇÒ ¶§¸¶´Ù ÇÁ·Î±×·¥»ó¿¡¼ ºÐ¸íÇÏ°Ô Ç¥ÇöÇÏ¿©¾ß ÇÑ´Ù. ´ç½ÅÀº °ø°£À» ÇÒ´çÇÏ°í ½ÍÀ» ¶§¸¶´Ù ÇÔ¼ö³ª ¸ÅÅ©·Î¸¦ È£ÃâÇÏ¿©¾ßÇϸç, Àμö¸¦ °¡ Áö°í ±× Å©±â¸¦ È®Á¤ÇØ¾ß ÇÑ´Ù. ´ç½ÅÀÌ ±× °ø°£À» ÇØÁ¦ÇÏ°í ½ÍÀ» ¶§¿¡µµ,´Ù¸¥ ÇÔ¼ö³ª ¸ÅÅ©·Î¸¦ È£Ãâ ÇÏ¿© ±×·¸°Ô ó¸®ÇÏ¸é µÈ´Ù. ´ç½ÅÀº ÀÌ·¯ÇÑ ÀÛ¾÷À» ¿øÇÒ ¶§¸¶´Ù ¿øÇÏ´Â ¸¸Å ÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù.
3.2 µ¿ÀÛÇÒ´ç°ú C
C¾ð¾î´Â CÇÁ·Î±×·¥¿¡ ÀÖ´Â º¯¼öµéÀ» ÅëÇØ ¸Þ¸ð¸® ÇÒ´çÀ» À§ÇÑ µÎ°¡Áö Á¾·ù¸¦ Áö¿øÇÑ´Ù.
0. Á¤ÀûÇÒ´çÀº ´ç½ÅÀÌ Á¤Àûº¯¼ö¸¦ Á¤ÀÇÇÒ ¶§ ¹ß»ýµÇ´Â °ÍÀÌ´Ù. °¢ Á¤Àûº¯¼ö´Â Á¤ÇØÁø Å©±âÀÇ, ¸Þ¸ð ¸® ÇÑ ºí·ÏÀ» Á¤ÀÇÇÑ´Ù. ±× °ø°£Àº ´ç½ÅÀÇ ÇÁ·Î±×·¥ÀÌ ½ÃÀ۵Ǿî ÀÏ´Ü ÇÒ´çµÇ¸é Àý´ë ÇØÁ¦µÇÁö ¾Ê ´Â´Ù.
0. ÀÚµ¿ ÇÒ´çÀº ÇÔ¼öÀÇ ÀÎÀÚ³ª Áö¿ªº¯¼ö¿Í °°Àº ÀÚµ¿º¯¼ö¸¦ Á¤ÀÇÇÒ ¶§ ¹ß»ýÇÑ´Ù. ÀÚµ¿º¯¼ö¸¦ À§ÇÑ °ø°£Àº ±× Á¤ÀǸ¦ Æ÷ÇÔÇÑ °÷(compound statement)¿¡ µé¾î°¡¸é ÇÒ´çµÇ°í ³ª¿À¸é ÇØÁ¦µÈ´Ù.
GNU C¿¡¼ ÀÚµ¿ÀúÀåÀÇ ±æÀ̰¡ ´Ù¾çÇÏ°Ô Ç¥ÇöµÇ¾îÁú¼ö ÀÖÁö¸¸ ´Ù¸¥ C¿¡¼´Â »ó¼öÀ̾î¾ß¸¸ ÇÑ´Ù.
µ¿ÀûÇÒ´çÀº Cº¯¼öµé¿¡ÀÇÇØ Áö¿øµÇÁö ¾Ê´Â´Ù; C¿¡´Â "´ÙÀ̳ª¹Í"À̶ó´Â ½ºÅ丮Áö Ŭ·¡½º°¡ ¾ø°í µ¿ ÀûÀ¸·Î ÇÒ´çµÈ °ø°£¿¡ ÀúÀåµÈ °ªÀº °áÄÚ CÀÇ º¯¼ö¸¦ ÅëÇØ ÇÒ¼ö ¾ø´Ù. ¿ÀÁ÷ Æ÷ÀÎÅ͸¦ ÅëÇØ µ¿ÀûÀ¸·Î ÇÒ´çµÈ °ø°£À» ÂüÁ¶ÇÏ´Â °ÍÀÌ À¯ÀÏÇÑ ¹æ¹ýÀÌ´Ù. ±×·¡¼ Á» ºÒÆíÇѵ¥´Ù, µ¿Àû°ø°£À» ÅëÇØ Ȱµ¿ÇÏ´Â ÇÁ ·Î¼¼½º´Â ½ÇÇà½Ã°£ÀÌ Á» ´õ ÇÊ¿äÇϱ⠶§¹®¿¡ ÇÁ·Î±×·¡¸ÓµéÀº Á¤ÀûÀ̳ª ÀÚµ¿º¯¼ö¸¦ ÅëÇØ ÇÒ¼ö ¾øÀ» °æ¿ì¿¡¸¸ ÀÌ µ¿Àû ÇÒ´çÀ» »ç¿ëÇÑ´Ù.
¿¹¸¦µé¾î ¸¸¾à ´ç½ÅÀÌ ±¸Á¶Ã¼ foobar¸¦ À§ÇØ ¾î¶² °ø°£À» µ¿ÀûÀ¸·Î ÇÒ´çÇϱ⠿øÇÑ´Ù¸é ´ç½ÅÀº ´Ü ¼øÈ÷ struct foobar¶ó°í¸¸ º¯¼ö¸¦ ¼±¾ðÇÒ¼ö ¾ø´Ù. ±×·¯³ª struct foobar * ÀÇ ÇüÀ¸·Î Æ÷ÀÎÅÍ º¯¼ö¸¦ ¼±¾ðÇÏ¸é ±× °ø°£ÀÇ ÁÖ¼Ò¸¦ ÁöÁ¤ÇÒ¼ö ÀÖ´Ù. ±×·¯¸é ´ç½ÅÀº *¿Í -> ¿ÀÆÛ·¹ÀÌÅ͸¦ »ç¿ëÇØ¼ ±× °ø°£ ÀÇ ³»¿ëÀ» ÂüÁ¶ÇÒ¼ö ÀÖ´Ù.
{
struct foobar *ptr
= (struct foobar *) malloc (sizeof (struct foobar));
ptr->name = x;
ptr->next = current_foobar;
current_foobar = ptr;
}
3.3 ÀÚÀ¯·Î¿î ÇÒ´ç
°¡Àå ÀϹÝÀûÀÎ µ¿ÀûÇÒ´çÀ» À§ÇÑ µµ±¸´Â mallocÀε¥ ±×°ÍÀº ¾î´À Å©±âÀÇ ¸Þ¸ð¸® ºí·Ïµµ ¾ðÁ¦µçÁö ÇÒ ´çÇÏ´Â°É Çã¿ëÇÏ°í ¶ÇÇÑ ±×µéÀ» ¾ðÁ¦µçÁö Å©°ÔÇϰųª ÀÛ°ÔÇϰųª ÇÒ¼ö ÀÖ°í ¾ðÁ¦µçÁö ±× ºÒ·°µéÀ» °³º°ÀûÀ¸·Î ¸Þ¸ð¸® °ø°£À» ÇØÁ¦ÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù.
3.3.1 Basic Storage Allocation: 3.3.1 ¸Þ¸ð¸® ÇÒ´çÀÇ ±âÃÊ
¸Þ¸ð¸® °ø°£À» ÇÒ´çÇϱâ À§ÇØ ºÎ¸£´Â mallocÀÇ ÇÁ·ÎÅäŸÀÔÀº 'stdlib.h' ÀÌ´Ù.
void * malloc (size_t size)
ÀÌ ÇÔ¼ö´Â »õ·ÎÀÌ ÇÒ´çµÈ ºí·ÏÀÇ Æ÷ÀÎÅ͸¦ longÀÇ Å©±â·Î ¸®ÅÏÇÏ°í ¾Æ´Ï¸é, ÇÒ´çÇÒ¼ö ¾ø¾úÀ»¶§´Â ³Î Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù.
ÇÒ´çµÈ ºí·ÏÀº ´ç½ÅÀÌ ½º½º·Î ÃʱâÈÇØ¾ßÇÑ´Ù.( ¾Æ´Ï¸é callocÀ» »ç¿ëÇϴµ¥ ±×°ÍÀº 3.3.5ÀýÀÇ [Allocating Cleared Space], 25ÆäÀÌÁö¸¦ º¸¸é ÀÖ´Ù. ) º¸Åë ´ç½ÅÀº ¸Þ¸ð¸® ºí·Ï¿¡ ÀúÀåÇϱ⠿øÇÏ´Â ´ë»óÀÇ Á¾·ù´ë·Î Æ÷ÀÎÅÍ¿¡ ±× °ªÀ» ij½ºÆ®(cast) ÇÒ °ÍÀÌ´Ù. ¿©±â¿¡ ±×·¸°Ô ÇÏ´Â ¿¹¸¦ º¸¿©ÁØ´Ù. ±× ¸®°í memsetÀ̶ó´Â ¶óÀ̺귯¸® ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ºí·ÏÀ» 0À¸·Î ÃʱâÈÇÏ´Â °Íµµ º¸¿©ÁØ´Ù.
/*Á¦°¡ Á» ÁÖ¼®À» ´Þ¾Æº¼±î¿ä?*/
struct foo *ptr;
. . .
ptr = (struct foo *) malloc (sizeof (struct foo));
/* À§ ¶óÀÎÀº ±¸Á¶Ã¼·Î ¼±¾ðµÈ fooÀÇ Å©±â¸¸Å mallocÀ» »ç¿ëÇØ¼ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´ÙÀ½ ±¸Á¶Ã¼ foo ÀÇ Å¸ÀÔÀ¸·Î ij½ºÆ®µÈ Æ÷ÀÎÅÍ(ptr)¿¡ ±× ¹øÁö°ªÀ» ³Ñ±â³×¿ä.. */
if (ptr == 0) abort ();
/* ¸¸¾à ÇÒ´çÀÌ ½ÇÆÐÇϸé.. */
memset (ptr, 0, sizeof (struct foo));
/* À§ÀÇ memset´Â ÀÎÀÚ·Î ÁÖ¾îÁø Æ÷ÀÎÅÍÀÇ ¹øÁö¸¦ ¹Þ¾Æ ¸Ç ¸¶Á÷¸· ÀÎÀÚ·Î ÁÖ¾îÁø Å©±â¸¸Å 0À¸·Î ¸Þ¸ð¸® ºí·ÏÀ» ÃʱâÈ ÇØ¿ä. */
´ç½ÅÀº ij½ºÆ®(case)ÇÏÁö ¾Ê°í ¾î´À Æ÷ÀÎÅÍ º¯¼ö ¾È¿¡µµ mallocÀÇ °á°ú¸¦ ÀúÀåÇÒ¼ö Àִµ¥ ±×°ÍÀº ANSI C´Â ÀÚµ¿ÀûÀ¸·Î ÇÊ¿äÇÒ ¶§ voidÇü Æ÷ÀÎÅ͸¦ ´Ù¸¥ ¾î¶²ÇüÀ¸·Îµµ º¯È¯½Ã۱⠶§¹®ÀÌ´Ù. ±×·¯³ª ij½ºÆ®(case)´Â ÁöÁ¤¸í·É¾î¸¦ ¸í½ÃÇϰųª ´ç½ÅÀÌ ÀüÅëÀûÀÎ C·Î ÄÚµùÀ» ¿øÇÑ´Ù¸é ÇÊ¿äÇÏ´Ù.
½ºÆ®¸µÀ» À§ÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÒ ¶§ mallocÀÇ Àμö¿¡ ½ºÆ®¸µÀÇ ±æÀÌ + 1À» ÇÏ´Â °ÍÀ» ÀØÁö¸¶¶ó. ÀÌ °ÍÀº ÇÊ¿äÇÑ °ø°£ÀÓ¿¡µµ ºÒ±¸ÇÏ°í ½ºÆ®¸µÀÇ ±æÀÌ¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â ³Î¹®ÀÚ·Î ³¡³ª±â ¶§¹®ÀÌ´Ù.
/* º¸ÃæÇÏ¸é ½ºÆ®¸µÀÇ ¸Ç ³¡¿¡ ÀÖ´Â ³Î¹®ÀÚ¸¦ ½ºÆ®¸µÀÇ ¹®ÀÚ¿ÀÌ ³¡³ª´Â °÷ÀÓÀ» ³ªÅ¸³»±â À§Çؼ Áß ¿äÇÑ °ø°£ÀÌÁö¸¸ ½ºÆ®¸µÀÇ ±æÀ̸¦ ¼¿¶§´Â Æ÷ÇÔµÇÁö ¾ÊÀ¸¹Ç·Î ½ºÆ®¸µÀ» À§ÇØ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÒ¶§´Â ±× ³Î¹®ÀÚ¸¦ À§ÇØ ½ºÆ®¸µÀÇ ±æÀÌ +1 ¸¸ÅÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´ç¹ÞÀÚ¶õ ¾ê±âÀϰɿä.*/
¿¹¸¦µé¸é:
-----------------------------------------------------------
char *ptr;
. . .
ptr = (char *) malloc (length + 1);
5.1ÀýÀÇ [Ropresentation of Strings] ÆäÀÌÁö 45¸¦ º¸¸é À̰Ϳ¡ ´ëÇÑ ´õ ¸¹Àº Á¤º¸°¡ ÀÖ´Ù.
3.3.2 Examples of malloc : 3.3.2 mallocÀÇ ¿¹Á¦µé
mallocÀº ¿øÇÏ´Â ¸Þ¸ð¸® ºí·Ïº¸´Ù ¸Þ¸ð¸® °ø°£ÀÌ ÀûÀº °æ¿ì¿¡ ³ÎÀ» ¸®ÅÏÇÑ´Ù. ´ç½ÅÀº ¸ðµç malloc ÀÇ °ªÀ» Ã¼Å©ÇØº¼¼ö Àֱ⠶§¹®¿¡ mallocÀ» ºÎ¸£°í ±× °ªÀÌ ³Î Æ÷ÀÎÅͶó¸é ¿¡·¯¸¦ »ç¿ëÀÚ¿¡°Ô º¸°íÇÒ ¼ö ÀÖ°í ¾Æ´Ï¸é ±×°ªÀ» ¿ÀÁ÷ ¸®ÅÏÇÏ´Â ¼ºê·çƾÀ» ¾²°íÀÚ ÇÒ ¶§ À¯¿ëÇÑ´Ù. ÀÌ ÇÔ¼ö´Â »óÅõÀûÀ¸·Î xmalloc¶ó°í ºÎ¸¥´Ù. ¿©±â¿¡ ±×°ÍÀÌ ÀÖ´Ù:
void * xmalloc (size_t size)
{
register void *value = malloc (size);
/* À§ ¶óÀÎÀº size¸¸ÅÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ·Á°í mallocÀ» »ç¿ëÇÏ´Â µ¥ ±× mallocÀÇ ¸®ÅϰªÀ» *value ·Î ¹Þ¾Ò³×¿ä. */
if (value == 0)
/* value°¡ 0À̸é, Áï ¸Þ¸ð¸® ÇÒ´ç½ÇÆÐ. */
fatal ("virtual memory exhausted");
return value;
/* ÇÒ´ç¿¡ ¼º°øÇÏ¸é ºí·ÏÀÇ ¹øÁö°¡ ÀúÀåµÈ °ªÀ» ¸®ÅÏ */
}
¿©±â¿¡ mallocÀÇ ½ÇÁ¦ »ç¿ë¿¹°¡ ÀÖ´Ù. savestringÀ̶ó´Â ÇÔ¼ö´Â ³Î¹®ÀÚ·Î ³¡³ª´Â »õ·Î¿î ÇÒ´ç°ø°£¿¡ ¹®ÀÚµéÀÇ ¿À» º¹»çÇÏ´Â ÇÔ¼ö´Ù.
char * savestring (const char *ptr, size_t len)
{
register char *value = (char *) xmalloc (len + 1);
/* À§¿¡¼ ¸¸µç xmallocÇÔ¼ö¸¦ »ç¿ëÇß±º¿ä. ±×·¯¸é ÇÒ´ç¿¡ ¼º°øÇß´Ù¸é ¿©±â¼ value´Â len+1ÀÇ Å©±â ¸¦ °¡Áø ºí·ÏÀÇ ¹øÁö¸¦ ÀúÀåÇϰí ÀÖ°Ú±º¿ä. */
memcpy (value, ptr, len);
/* memcpyÇÔ¼ö¸¦ »ç¿ëÇØ¼ savestringÇÔ¼ö°¡ ÀÎÀÚ·Î ¹Þ¾Æ¿Â ptrÀ» value·Î len±æÀÌ ¸¸Å º¹»çÇß±¸ ¿ä... */
value[len] = '\0';
/* valueÀÇ ¸Ç ³¡¿¡ ³Î¹®ÀÚ¸¦ Çϳª ÀúÀåÇϸé value´Â À§¿¡¼ ¼³¸íÇÑ´ë·Î ½ºÆ®¸µÀ» ÀúÀåÇÑ ºí·ÏÀÇ ÁÖ ¼Ò°¡ µÇ°ÚÁö¿ä? */
return value;
}
mallocÀ¸·Î ÇÒ´çµÈ ¸Þ¸ð¸® ºí·ÏÀº ´ç½Å¿¡°Ô ¾î¶² µ¥ÀÌÅÍ Å¸ÀÔµµ ÀúÀåÇÒ ¼ö ÀÖ°í ±×°Í°ú ÀÏÄ¡½ÃÅ´ À» º¸ÁõÇÑ´Ù. GNU½Ã½ºÅÛ¿¡¼ ÁÖ¼Ò´Â Ç×»ó 8ÀÇ ¹è¼ö·Î Áõ°¡ÇÑ´Ù. ±×·¯³ª ºí·ÏÀÌ 16°³º¸´Ù ¸¹Àº °æ¿ì ¿¡ ÁÖ¼Ò´Â Ç×»ó 16ÀÇ ¹è¼öÀÌ´Ù. ¿ÀÁ÷ µå¹°°Ô ³ôÀº °æ°è°¡ ÇÊ¿äÇÑ °æ¿ì¿¡´Â memalignÀ̳ª vallocÀ» »ç¿ëÇÑ´Ù. ( 3.3.7ÀýÀÇ [Aligned Memory Blocks]¸¦ º¸¶ó)
¹«¾ð°¡¸¦ À§ÇØ »ç¿ëµÇ¾îÁø ºí·ÏÀÇ ³¡¿¡ ÇÒ´çµÈ ¸Þ¸ð¸®´Â ¾Æ¸¶µµ ´Ù¸¥ ºí·ÏÀ¸·Î ÀÌ¹Ì ´Ù¸¥ malloc ¿¡ÀÇÇØ ÇÒ´çµÇ¾îÁ³À» °ÍÀÌ´Ù. ¸¸¾à ÀÌ¹Ì ´ç½ÅÀÌ ¿ä±¸ÇѰͺ¸´Ù ´õ ¸¹Àº ¸Þ¸ð¸® ºí·ÏÀ» Ãë±ÞÇÏ±æ ¿øÇÑ ´Ù¸é ÀÚÄ©ÇÏ¸é ³» ÀÚ½ÅÀÇ ºí·ÏÀÇ µ¥ÀÌÅ͸¦ ÆÄ±«Çϰųª ¾Æ´Ï¸é ´Ù¸¥ ºí·ÏÀÇ ³»¿ëÀ» ÆÄ±«ÇÒÁöµµ ¸ð¸¥ ´Ù. ¸¸¾à ´ç½ÅÀÌ ÀÌ¹Ì ÇÑ ºí·ÏÀ» ÇÒ´ç¹Þ¾Ò°í °Å±â¿¡ ´õ Å« °ø°£ÀÌ ÇÊ¿äÇÏ´Ù¸é reallocÀ» »ç¿ëÇ϶ó( 3.3.4ÀýÀÇ [Changing Block Size] 24ÆäÀÌÁö¸¦ º¸¶ó)
3.3.3 malloc¿¡ÀÇÇØ ÇÒ´çµÈ ¸Þ¸ð¸® ÇØÁ¦Çϱâ
´ç½ÅÀÌ mallocÀ¸·Î ¾ò¾ú´ø ¸Þ¸ð¸®ºí·°À» ´õ ÀÌ»ó »ç¿ëÇÏÁö ¾ÊÀ¸¸é freeÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¾î¶² ºí·ÏÀÌ ±× °ø°£À» ´Ù½Ã ÇÒ´ç¹ÞÀ»¼ö ÀÖµµ·Ï ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇØ¾ß ÇÑ´Ù. freeÇÔ¼öÀÇ ÇÁ·ÎµµÅ¸ÀÔÀº 'stdlib.h'ÀÌ ´Ù.
void free (void *ptr)
ÀÌ ÇÔ¼ö´Â ptr¿¡ÀÇÇØ ÁöÁ¤µÈ °ø°£ÀÇ ºí·ÏÀ» ÇØÁ¦ÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù.
void cfree (void *ptr)
ÀÌ ÇÔ¼ö´Â free¿Í °°ÀºÀÏÀ» ÇÑ´Ù. À̰ÍÀº SunOS¿Í ȣȯÀ» À§ÇÏ¿© Á¦°øµÈ´Ù.
ºí·ÏÀÇ ÇØÁ¦ÈÄ¿¡ ±× ºí·ÏÀÇ ³»¿ëÀº º¯ÇÑ´Ù. ±×·¡¼ ÇØÁ¦ÈÄ¿¡ ±× ºí·Ï¾È¿¡¼ ¾î¶² µ¥ÀÌÅ͸¦ ¹ß°ßÇÒ Áö( ¸¶Ä¡ ¿¬°áµÈ ºí·Ï¿¡¼ ´ÙÀ½ ºí·ÏÀÇ Æ÷ÀÎÅÍó·³)¾Æ¹«°Íµµ ¿¹»óÇÒ¼ö ¾ø´Ù. ´ç½ÅÀº ±× ºí·ÏÀ» ÇØ Á¦Çϱâ Àü¿¡ ±× ºí·ÏÀÇ ¹ÛÀ¸·Î ´ç½ÅÀÌ ÇÊ¿äÇÑ ¸ðµç °ÍÀ» º¹»çÇ϶ó. ¿©±â¿¡ ¿¬°áµÈ ¸ðµç ºí·°°ú Æ÷ ÀÎÆ®µÈ ¹®ÀÚ¿À» ÇØÁ¦ÇÏ´Â Àû´çÇÑ ¹æ¹ýÀÇ ¿¹°¡ ÀÖ´Ù.
struct chain
{
struct chain *next;
char *name;
}
/* ´Ü¼ø ¿¬°á ¸®½ºÆ®( Single Linked List) ±¸Á¶¸¦ °¡Á³±º¿ä.
´Ù½Ã ÂüÁ¶Çغ¸¼¼¿ä..*./
void free_chain (struct chain *chain)
{
while (chain != 0)
/* chainÀÇ °ªÀÌ 0ÀÌ µÉ ¶§±îÁö Áï ¿¬°áµÈ ¸®½ºÆ®°¡ ¸Þ¸ð¸®¸¦ ´Ù ÇØÁ¦ÇÒ¶§±îÁö ·çÇÁ¸¦ µ¹°Ú±º¿ä. */
{
struct chain *next = chain->next;
free (chain->name);
free (chain);
/* ¸ÕÀú ¾È¿¡ ÀúÀåµÈ name¸¦ ¸ÕÀú ÇØÁ¦Çϰí(±×³É ´Ü¼øº¯¼ö°¡ ¾Æ´Ï¶ó Æ÷ÀÎÅÍ·Î ÀúÁ¤µÆÀ¸¹Ç·Î) ´ÙÀ½ ¿¡¼¾ß chainºí·°À» ÇØÁ¦Çϴ±º¿ä. */
chain = next;
/* ±×¸®°í ´ÙÀ½À» °¡¸£Å°°Ô ÇØ¼ À§¿Í°°Àº µ¿ÀÛÀÇ ¹Ýº¹À» ÇÏ¸é ´Ù ÇØÁ¦µÇ°ÚÁö¿ä? */
}
}
°¡²û, freeÇÔ¼ö´Â ¿î¿µÃ¼Á¦¿¡°Ô ½ÇÁ¦·Î ¸Þ¸ð¸®¸¦ ¸®ÅÏÇÒ¼ö ÀÖ°í ÇÁ·Î¼¼½º¸¦ ÀÛ°Ô ¸¸µéÁö¸¸ º¸ÅëÀº ±× °ø°£ÀÇ Àç»ç¿ëÀ» À§ÇØ malloc¿¡ ÀÇÇØ ´Ù½Ã ºÒ¸®¿öÁø ÈÄ¿¡ Çã¿ëµÈ´Ù. Áï, ±× °ø°£(ÀÌ¹Ì ÇØÁ¦µÈ)Àº ÇØÁ¦µÈ ¸Þ¸ð¸® ¸®½ºÆ®¸¦ ´ç½ÅÀÇ ÇÁ·Î±×·¥¾È¿¡ ³²°Ü ´Ù¸¥ malloc¿¡ÀÇÇØ ³»ºÎ¿¡¼ »ç¿ëµÈ´Ù.
ÇÁ·Î±×·¥ÀÇ ³¡¿¡¼ ºí·ÏÀ» ÇØÁ¦ÇÒ¼ö ¾ø´Âµ¥ ±×°ÍÀº ÇÁ·Î±×·¥¿¡¼ ¾²ÀÎ ¸ðµç °ø°£À» ±× ÇÁ·Î¼¼½º°¡ ³¡³¯ ¶§ ½Ã½ºÅÛ¿¡°Ô µÇµ¹·Á ÁÖ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù.
3.3.5 ±ú²ýÇÑ °ø°£ ÇÒ´çÇϱâ
ÇÔ¼ö callocÀº ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í °Å±â¿¡ 0À» ä¿î´Ù. ÀÌ ÇÔ¼ö´Â 'stdlib.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
ÇÔ¼ö void * calloc (size_t count, size_t eltsize)
ÀÌ ÇÔ¼ö´Â °¢ eltsize Å©±â¸¶´Ù count¿ä¼ÒÀÇ º¤Å͸¦ ´ã±â¿¡ ÃæºÐÇÑ ±æÀÌÀÇ ºí·°À» ÇÒ´çÇÑ´Ù.±× ³»¿ë Àº ¸ðµÎ Áö¿öÁö°í callocÀ» ¹ÝȯÇϱâ Àü¿¡ 0À¸·Î ä¿î´Ù.
´ç½ÅÀº callocÀ» ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
void * calloc (size_t count, size_t eltsize)
/*À¸Èø!..size_t¶ó´Â µ¥ÀÌÅÍ Çüŵµ ÀÖ¾ú³²?..¿ÕÃʺ¸*/
{
size_t size = count * eltsize;
void *value = malloc (size);
if (value != 0)
memset (value, 0, size);
/* valueÁöÁ¡À» size¸¸ÅÀÇ 0À¸·Î ä¿ì´Â ÇÔ¼öÀ̱º*/
return value;
/*ÀÌ·¸°Ô ÇÏ¸é Æ÷ÀÎÅÍ ÁÖ¼Ò°¡ ¹ÝȯµÇ³²À¯? °í¼ö´Ôµé?*/
}
¿äÁòÀº callocÀ» ÀÚÁÖ ¾²Áö ¾Ê´Â´Ù,¿Ö³ÄÇÏ¸é ´õ ÀÚÁÖ ¾²ÀÌ´Â ´Ù¸¥ ÇÔ¼öµéÀ» °£´ÜÈ÷ °áÇÕÇØ¼ ½áµµ µÇ±â ¶§¹®ÀÌ´Ù. callocÀº ¾ÆÁÖ ¾µ ¸ð ¾øÁö´Â ¾ÊÁö¸¸ ±¸½Ã´ëÀÇ À¯¹°ÀÌ µÇ¾î°¡°í ÀÖ´Ù.
3.3.6 mallocÀ» À§ÇÑ È¿À²ÀûÀÎ Á¶Ä¡
mallocÀ» °¡Àå Àß »ç¿ëÇÏ·Á¸é, mallocÀÇ GNU ¹öÁ¯Àº Ç×»ó ÀûÀº ¾çÀÇ ¸Þ¸ð¸®¸¦ ±× Å©±â°¡ 2ÀÇ ¹è¼ö ÀÎ ºí·°À¸·Î ³ª´©´Â °ÍÀÓÀ» ¾Ë¾Æ¾ß ÇÑ´Ù. ±×°ÍÀº ºÐÇÒµÈ ¿µ¿ªÀ» 2ÀÇ ¹è¼ö·Î À¯ÁöÇÑ´Ù.À̰ÍÀº ±× Å©±â ¸¦ ÇÑ ÆäÀÌÁöÀÇ Å©±â·Î ¸¸µé ¼ö ÀÖ°Ô ÇÑ´Ù.±×·¯¹Ç·Î,¸¸¾à ´ç½ÅÀÌ mallocÀ» È¿À²ÀûÀ¸·Î ¸¸µé±â À§Çؼ ÀÛÀº ºí·°ÀÇ Å©±â¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Â °æ¿ì¶ó¸é ±×°ÍÀ» 2ÀÇ ¹è¼ö·Î ¸¸µé¾î¶ó.
ÀÏ´Ü ÇÑ ÆäÀÌÁö°¡ ƯÁ¤ÇÑ ºí·°ÀÇ Å©±â·Î ³ª´©¾îÁö°Ô µÇ¸é, ±×°ÍÀº ¸ðµç ºí·°ÀÌ ÇØÁ¦µÇÁö ¾Ê´Â ÀÌ»ó ´Ù¸¥ Å©±â·Î Àç»ç¿ëµÉ ¼ö´Â ¾ø´Ù. ¸¹Àº ÇÁ·Î±×·¥¿¡¼ ºí·°ÀÌ ´Ù¸¥ Å©±â·Î Àç»ç¿ëµÇ´Â ÀÏÀº Á»Ã³·³ ÀϾÁö ¾Ê´Â´Ù. µû¶ó¼,¸¹Àº ´Ù¸¥ ¸ñÀûÀ¸·Î »ç¿ëÇÒ ºí·°µéÀ» °°Àº Å©±â·Î ³ª´©¾î ³õÀ½À¸·Î½á ÇÁ·Î ±×·¥ÀÌ ¸Þ¸ð¸®¸¦ È¿À²ÀûÀ¸·Î »ç¿ëÅä·Ï ÇÒ ¼ö°¡ ÀÖ´Â °ÍÀÌ´Ù.
ÇÑ ÆäÀÌÁö ¶Ç´Â ±× ÀÌ»óÀÇ ¸Þ¸ð¸® ºí·°µéÀ» ¿ä±¸ÇÒ ¶§, mallocÀº ´Ù¸¥ ¹æ¹ýÀ» ¾´´Ù;±× Å©±â¸¦ ÇÑ Æä ÀÌÁöÀÇ ¹è¼ö·Î ¸¸µé°í,±× ºí·°À» ÅëÇÕÇϰųª ÇÊ¿äÇÑ ¸¸Å ³ª´©¾î¼ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
µÎ°¡ÁöÀÇ ¹æ¹ýÀ» ¾²´Â ÀÌÀ¯´Â ÀÛÀº ºí·°µéÀ» °¡´ÉÇÑÇÑ »¡¸® ÇÒ´çÇϰí ÇØÁ¦ÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù´Â µ¥ ÀÖ´Ù. ±×·¯³ª Å« ºí·°ÀÇ °æ¿ì¿¡´Â ÇÁ·Î±×·¥ÀÌ ±×°ÍÀ» »ç¿ëÇÏ´Â µ¥ ¾î´À Á¤µµÀÇ ½Ã°£À» ¼Ò¿äÇϱ⠶§ ¹®¿¡ ¼Óµµ°¡ ±×¸® Áß¿äÄ¡ ¾Ê´Ù. ¶ÇÇÑ Å« ºí·°Àº ´ç¿¬È÷ ±× ¼ýÀÚ¿¡ ÀÖ¾î¼ ÀûÀº °ÍÀÌ´Ù. ±×·¯¹Ç·Î, Å« ºí·°¿¡ À־ ³¶ºñµÈ °ø°£À» ÃÖ¼ÒÈÇÏ´Â µ¥ ½Ã°£À» Á»´õ ÅõÀÚÇÏ´Â ¹æ¹ýÀÌ Àǹ̰¡ ÀÖ´Â ¹ýÀÌ´Ù.
3.3.7 Àß Á¤µ·µÈ ¸Þ¸ð¸® ºí·° ÇÒ´çÇϱâ
GNU üÁ¦¿¡¼ malloc°ú realloc¿¡ ÀÇÇØ ¹ÝȯµÇ´Â ºí·°ÀÇ ÁÖ¼Ò´Â Ç×»ó 8ÀÇ ¹è¼öÀÌ´Ù. ¸¸¾à ´ç½ÅÀÌ 8 º¸´Ù ´õ Å« 2ÀÇ ¹è¼öÀÇ ¹è¼ö¸¦ ÁÖ¼Ò·Î °®´Â ºí·°À» ¿øÇÑ´Ù¸é, memalignÀ̳ª vallocÀ» »ç¿ëÇ϶ó.ÀÌ ÇÔ¼öµéÀº 'stdio.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
GNU ¶óÀ̺귯¸®¸¦ »ç¿ëÇØ¼ ´ç½ÅÀº menalign°ú vallocÀÌ ¹ÝȯÇÏ´Â ºí·°À» ÇØÁ¦Çϱâ À§ÇÏ¿© free¸¦ ¾µ ¼ö ÀÖ´Ù. free´Â BSD¿¡¼´Â ÀÛµ¿ ÇÏÁö ¾ÊÀ¸¸ç,BSD´Â ±×·¯ÇÑ ºí·°µéÀ» ÇØÁ¦Çϱâ À§ÇÑ ¾î¶² ¼ö´Ü µµ Á¦°ø ÇÏÁö ¾Ê´Â´Ù.
ÇÔ¼ö void * memalign (size_t size, size_t boundary )
memalign ÇÔ¼ö´Â ±× ÁÖ¼Ò°¡ boundaryÀÇ ¹è¼öÀÎ size ¹ÙÀÌÆ®ÀÇ ºí·ÏÀ» ÇÒ´çÇÑ´Ù. boundary´Â 2ÀÇ ¹è¼ö¿©¾ß¸¸ ÇÑ´Ù! memalign ÇÔ¼ö´Â malloc ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ´Ù¼Ò°£ ´õ Å« ºí·°À» ÇÒ´çÇÏ°í³ª¼,Áö Á¤µÈ boundary»ó¿¡ ÀÖ´Â ºí·°³»ÀÇ ÁÖ¼Ò¸¦ ¹ÝȯÇÑ´Ù.
ÇÔ¼ö void * valloc (size_t size)
vallocÀ» »ç¿ëÇÏ´Â °ÍÀº memalignÀ» ¾²µÇ µÎ¹øÀç ÀμöÀÇ °ªÀÎ ÆäÀÌÁö Å©±â¸¦ »ý·«ÇÏ´Â °Í°ú °°´Ù. ±×°ÍÀº ÀÌ·¸°Ô º¸ÃæµÈ´Ù:
void * valloc (size_t size)
{
return memalign (size, getpagesize ());
}
3.3.8 ¸Þ¸ð¸® ȼÀÇ Àϰü¼º üũÇϱâ
´ç½ÅÀº mcheck ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© µ¿Àû ÀúÀå¼ÒÀÇ Àϰü¼ºÀ» üũÇÏ´Â µ¥ mallocÀ» ¿äûÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â GNU È®Àå ÇÔ¼öÀ̸ç,'malloc.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
ÇÔ¼ö int mcheck (void (*abortfn) (void))
mcheck¸¦ È£ÃâÇÏ°Ô µÇ¸é malloc¿¡°Ô °¡²û¾¿ Àϰü¼º üũ¸¦ ¼öÇàÇϵµ·Ï ÇÑ´Ù. Àϰü¼º üũ´Â malloc ÀÌ ÇÒ´çÇØ ³õÀº ºí·°ÀÇ ³¡¿¡´Ù past¶ó°í ±â·ÏÇØ ³õ´Â °Í°ú °°Àº ÀÏÀ» ÇÒ °ÍÀÌ´Ù.
Àμö abortfnÀº ºÒÀÏÄ¡°¡ ¹ß°ßµÇ¾úÀ» ¶§ È£ÃâµÇ´Â ÇÔ¼öÀÌ´Ù. ´ç½ÅÀÌ ³Î(null) Æ÷ÀÎÅ͸¦ ÁÖ°Ô µÇ¸é, abort ÇÔ¼ö°¡ »ç¿ëµÈ´Ù.
mallocÀ» ½á¼ ÀÌ¹Ì ¾î¶² °ÍÀ» ÇÒ´çÇÑ µÚ¿¡ ÇÒ´ç üũ¸¦ ½ÃÀÛÇϱ⿣ ³Ê¹« ´Ê¾ú´Ù.ÀÌ·¯ÇÑ °æ¿ì¿¡ mcheck´Â ¾Æ¹«·± µµ¿òÀÌ µÇÁö ¾Ê´Â´Ù. ±× ÇÔ¼ö´Â ³Ê¹« ´Ê°Ô È£ÃâÇÏ°Ô µÇ¸é -1À» ¹ÝȯÇϸç,±×·¸Áö ¾ÊÀ» °æ¿ì¿¡(¼º°øÇÏ¿´À» ¶§) 0À» ¹ÝȯÇÑ´Ù.
ÀÏÂġ mcheck¸¦ È£ÃâÇÏ¿© ¹è¿ÇÏ´Â °¡Àå ¼Õ½¬¿î ¹æ¹ýÀº ´ç½ÅÀÌ ÇÁ·Î±×·¥À» ¸µÅ©ÇÒ ¶§ '-lmchek' ¿É¼ÇÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù; ±×·¯¸é ´ç½ÅÀº ÇÁ·Î±×·¥ ¼Ò½º¸¦ ÀüÇô º¯°æÇÒ Çʿ䰡 ¾ø´Ù.
3.3.9 ÀúÀå¼Ò ÇÒ´ç hookµé
GNU C ¶óÀ̺귯¸®´Â ÀûÀýÇÑ hook ÇÔ¼öµéÀ» ¸í½ÃÇÔÀ¸·Î½á ´ç½ÅÀÌ malloc,realloc°ú freeÀÇ ÇàÀ§¸¦ º¯°æÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.ÀÌ·¯ÇÑ hookµéÀº,¿¹ÄÁµ¥,µ¿Àû ÀúÀå¼Ò ÇÒ´çÀ» »ç¿ëÇÑ ÇÁ·Î±×·¥µéÀ» µð¹ö±× Çϴµ¥ µµ¿òÀ» ÁØ´Ù. hook º¯¼öµéÀº 'malloc.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
º¯¼ö ____malloc__hook
ÀÌ º¯¼öÀÇ °ªÀº mallocÀÌ È£ÃâµÉ ¶§¸¶´Ù »ç¿ëÇÏ´Â ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÌ´Ù.´ç½ÅÀº ÀÌ ÇÔ¼ö¸¦ malloc °ú °°Àº ¸ð¾çÀ¸·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
Áï,´ÙÀ½°ú °°´Ù;
void *function (size_t size)
º¯¼ö ____realloc__hook
ÀÌ º¯¼öÀÇ °ªÀº reallocÀÌ È£ÃâµÉ ¶§¸¶´Ù »ç¿ëÇÏ´Â ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÌ´Ù.´ç½ÅÀº ÀÌ ÇÔ¼ö¸¦ realloc °ú °°Àº ¸ð¾çÀ¸·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
Áï,´ÙÀ½°ú °°´Ù;
void *function (void *ptr, size_t size)
º¯¼ö ____free__hook
ÀÌ º¯¼öÀÇ °ªÀº free°¡ È£ÃâµÉ ¶§¸¶´Ù »ç¿ëÇÏ´Â ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÌ´Ù.´ç½ÅÀº ÀÌ ÇÔ¼ö¸¦ free¿Í °° Àº ¸ð¾çÀ¸·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
Áï,´ÙÀ½°ú °°´Ù;
void function (void *ptr)
´ç½ÅÀº ÀÌ ÇÔ¼öµé ÁßÀÇ ÇϳªÀÇ hook·Î¼ ´ç½ÅÀÌ ÀνºÅçÇÑ ÇÔ¼ö´Â ±× hookÀÇ ÀÌÀüÀÇ °ªÀÌ ¸ÕÀú ÀúÀå µÇÁö ¾ÊÀº »óÅ¿¡¼ ÀçÂ÷ ±× ÇÔ¼ö¸¦ È£ÃâÇÏÁö´Â ¾Ê´Â´Ù´Â Á¡À» ºÐ¸íÇÏ°Ô ¾Ë¾ÆµÎ¾î¾ß ÇÑ´Ù! ±×·¸Áö¾Ê À¸¸é ´ç½ÅÀÇ ÇÁ·Î±×·¥Àº ¹«Çѹݺ¹¿¡ ºüÁ® ¹ö¸± °ÍÀÌ´Ù.
ÀÌÁ¦ __malloc_hook¸¦ ÀûÀýÇÏ°Ô »ç¿ëÇÏ´Â ¹ýÀ» ¿¹¸¦ µé¾î º¸±â·Î ÇÏÀÚ. ±×°ÍÀº mallocÀÌ È£ÃâµÉ ¶§¸¶´Ù Á¤º¸¸¦ ±â·ÏÇØ³»´Â ÇÔ¼ö¸¦ ÀνºÅçÇÑ´Ù.
static void *(*old_malloc_hook) (size_t);
/* my_malloc_hook ÇÔ¼öÀÇ Á¤Àǰ¡ ½ÃÀ۵Ǵ °Ç°¡?*/
static void *my_malloc_hook (size_t size)
{
void *result;
/*Æ÷ÀÎÅÍ result ¼±¾ðÇØ µÐ ´ÙÀ½*/
__malloc_hook = old_malloc_hook;
result = malloc (size);
/*sizeÅ©±âÀÇ ¸Þ¸ð¸® ÇÒ´çÇϰí*/
__malloc_hook = my_malloc_hook;
printf ("malloc (%u) returns %p\n", (unsigned int) size, result);
/*size¿Í resultÀÇ °ªÀ» ¸ð´ÏÅÍ·Î Ãâ·ÂÇÑ ´ÙÀ½*/
return result;
/*result¸¦ ¹ÝȯÇÑ´Ù???..voidÇÔ¼ö°¡???*/
}
main ()
{
...
old_malloc_hook = __malloc_hook;
/*À½..A¿¡´Ù B¸¦ ´ëÀÔÇϰí B¿¡´Ù C¸¦ ´ëÀÔ?*/
__malloc_hook = my_malloc_hook;
/*À½,ÀÚ¼¼È÷ º¸¸é,my_malloc_hookÀÌ ÀÛµ¿ÇÏ¸é¼ »õ·Ó°Ô ÇÒ´çµÇ´Â sizeÅ©±âÀÇ ¸Þ¸ð¸®¸¦ result¿¡ ¹Þ¾Æ¼ __malloc_hook¿¡´Ù ´ëÀÔ½ÃŰ°Ú³×¿©..ÈåÈå ..¿À¸®¹«Áß!..Ãʺ¸ÀÇ ¼³¿ò...¿ìÀ×??..__malloc_hook ÀÌ Àμö size_t size¾øÀ̵µ ÀÛµ¿À» Çϳ²??..¾Æ..»ì·ÁÁà!*/
...
}
mcheck ÇÔ¼ö(3.3.8 [¸Þ¸ð¸® ȼÀÇ ÀÏÁ¤¼º üũÇϱâ],26ÂÊ ÂüÁ¶)´Â ÀÌ·¯ÇÑ hookµéÀ» ÀνºÅçÇÏ¿©¾ß ÀÛ µ¿ÇÑ´Ù.
3.3.10 mallocÀ¸·Î ÇÒ´çÇÑ ÀúÀå¼Ò Åë°è
´ç½ÅÀº mstats ÇÔ¼ö¸¦ È£ÃâÇÔÀ¸·Î½á µ¿Àû ÀúÀå¼Ò ÇÒ´ç¿¡ °üÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù.ÀÌ ÇÔ¼ö¿Í ±×°Í ÀÇ ¿¬°üµÈ µ¥ÀÌÅÍ ÇüÅ´ 'malloc.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù;±×°ÍµéÀº GNUÀÇ È®ÀåÀÌ´Ù.
µ¥ÀÌÅÍ ÇüÅ struct mstats
ÀÌ ±¸Á¶Ã¼ ÇüÅ´ µ¿Àû ÀúÀå¼Ò ÇÒ´çÀÚ¿¡ °üÇÑ Á¤º¸¸¦ ¹ÝȯÇϴµ¥ »ç¿ëµÈ´Ù.±×°ÍÀº ´ÙÀ½ ¸â¹öµéÀ» ´ã °íÀÖ´Ù.
size_t bytes_total
À̰ÍÀº malloc¿¡ ÀÇÇØ °ü¸®µÇ´Â ¸Þ¸ð¸®ÀÇ Àüü Å©±âÀÇ ¹ÙÀÌÆ®¼öÀÌ´Ù.
size_t chunks_used
À̰ÍÀº »ç¿ëµÈ ¸Þ¸ð¸® µ¢¾î¸®ÀÇ ¼ýÀÚÀÌ´Ù. (ÀúÀå¼Ò ÇÒ´çÀÚ´Â ³»ºÎÀûÀ¸·Î ¿î¿µÃ¼Á¦·ÎºÎÅÍ ¸Þ¸ð¸® µ¢ ¾î¸®¸¦ ¾ò¾î³½ ´ÙÀ½,±×°ÍµéÀ» °³º°ÀûÀÎ mallocÀÇ ¿ä±¸¿¡ ¸¸Á·µÇµµ·Ï ³ª´©¾îÁØ´Ù; 3.3.6 [mallocÀ» À§ÇÑ È¿À²ÀûÀÎ Á¶Ä¡],25ÂÊ ÂüÁ¶)
size_t bytes_used
À̰ÍÀº »ç¿ëµÈ ¹ÙÀÌÆ® ¼öÀÌ´Ù.
size_t chunks_free
À̰ÍÀº »ç¿ëµÇÁö ¾ÊÀº µ¢¾î¸®ÀÇ ¼ýÀÚÀÌ´Ù.-- Áï,¿î¿µÃ¼Á¦¿¡ ÀÇÇØ ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡ ÇÒ´çµÇ¾úÀ¸³ª, ¾ÆÁ÷ »ç¿ëµÇÁö ¾ÊÀº ¸Þ¸ð¸®ÀÌ´Ù.
size_t bytes_free
À̰ÍÀº »ç¿ëµÇÁö ¾ÊÀº ¹ÙÀÌÆ® ¼ýÀÚÀÌ´Ù.
ÇÔ¼ö struct mstats mstats (void)
ÀÌ ÇÔ¼ö´Â struct mstats ÇüÅÂÀÇ ±¸Á¶¿¡¼ ÇöÀçÀÇ µ¿Àû ¸Þ¸ð¸® »ç¿ë¿¡ °üÇÑ Á¤º¸¸¦ ¹ÝȯÇÑ´Ù.
3.3.11 malloc °ü·Ã ÇÔ¼ö ¿ä¾à
malloc°ú ÇÔ²² ÀÛµ¿ÇÏ´Â ÇÔ¼öµéÀ» ¿ä¾àÇØº¸ÀÚ.
void *malloc (size_t size)
size ¹ÙÀÌÆ®ÀÇ ÇÑ ºí·°À» ÇÒ´çÇϱâ. 3.3.1 [±âº»ÀûÀÎ ÇÒ´ç], 22ÂÊ ÂüÁ¶.
void free (void *addr)
malloc¿¡ ÀÇÇØ ÀÌÀü¿¡ ÇÒ´çµÇ¾ú´ø ºí·°À» ÇØÁ¦Çϱâ. 3.3.3 [mallocÀÌÈÄÀÇ ÇØÁ¦],23ÂÊ ÂüÁ¶.
void *realloc (void *addr, size_t size)
malloc¿¡ ÀÇÇØ ÀÌÀü¿¡ ÇÒ´çµÇ¾ú´ø ºí·°À» Å©°Ô ¶Ç´Â ÀÛ°Ô ¸¸µé¾î¼, »õ·Î¿î Áö¿ª¿¡ ±×°ÍÀ» º¹»çÇϱâ.
3.3.4 [ºí·° Å©±â º¯°æ],24ÂÊ ÂüÁ¶.
void *calloc (size_t count, size_t eltsize)
mallocÀ» »ç¿ëÇÏ¿© count * eltsize ¹ÙÀÌÆ®ÀÇ ºí·°À» ÇÒ´çÇÏ¿© ±× ³»¿ëÀ» Á¦·Î·Î ä¿ì±â. 3.3.5 [±ú²ý ÇÑ °ø°£ ÇÒ´çÇϱâ],25ÂÊ ÂüÁ¶.
void *valloc (size_t size)
size ¹ÙÀÌÆ®ÀÇ ºí·°À» ÇÒ´çÇÏ¿©,ÇÑ ÆäÀÌÁö °æ°èÁöÁ¡¿¡¼ ½ÃÀÛÇϱâ. 3.3.7 [Àß Á¤µ·µÈ ¸Þ¸ð¸® ºí·°],25 ÂÊ ÂüÁ¶.
void *memalign (size_t size, size_t boundary )
size ¹ÙÀÌÆ®ÀÇ ºí·°À» ÇÒ´çÇÏ¿© boundaryÀÇ ¹è¼öÀÎ ÁÖ¼Ò·Î ½ÃÀÛÇϱâ. 3.3.7 [Àß Á¤µ·µÈ ¸Þ¸ð¸® ºí ·°],25ÂÊ ÂüÁ¶.
int mcheck (void (*abortfn) (void))
mallocÀ¸·Î ÇÏ¿©±Ý ¼ö½Ã·Î µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ Àϰü¼ºÀ» üũÇÏ°Ô ÇÏ¿© ºÒÀÏÄ¡°¡ ÀϾ¸é abortfnÀ» È£ÃâÇÑ´Ù. 3.3.8 [¸Þ¸ð¸® ȼÀÇ Àϰü¼º üũÇϱâ],26ÂÊ ÂüÁ¶.
void *(*__malloc_hook) (size_t size)
mallocÀÌ È£ÃâµÉ ¶§¸¶´Ù »ç¿ëÇÏ´Â ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍ.
void *(*__realloc_hook) (void *ptr, size_t size)
reallocÀÌ È£ÃâµÉ ¶§¸¶´Ù »ç¿ëÇÏ´Â ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍ.
void (*__free_hook) (void *ptr)
free°¡ È£ÃâµÉ ¶§¸¶´Ù »ç¿ëÇÏ´Â ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍ.
struct mstats mstats (void)
ÇöÀçÀÇ µ¿Àû ¸Þ¸ð¸® »ç¿ë¿¡ °üÇÑ Á¤º¸ ¹ÝȯÇϱâ. 3.3.10 [mallocÀ¸·Î ÇÒ´çÇÑ ÀúÀå¼Ò Åë°è],27ÂÊ ÂüÁ¶.
3.4 Obstacks
obstack´Â objectµéÀÇ ½ºÅõéÀÌ ÀÖ´Â ¸Þ¸ð¸®ÀÇ °øµ¿°ü¸®¼Ò(pool) ÀÌ´Ù. ´ç½ÅÀº obstackµéÀ» ºÐ¸®ÇÏ¿© ¸î °³¶óµµ ¸¸µé ¼ö ÀÖ°í ±×¸®°í Á¤ÇØÁø obstack¿¡ object¸¦ ÇÒ´çÇÑ´Ù. °¢ obstack¾È¿¡ ¸¶Áö¸· objedt ¿¡¼ ù ¹øÂ° Çϳª´Â ¹Ýµå½Ã ÇØÁ¦µÈ »óÅÂÀÌ¿©¾ß ÇÏÁö¸¸ °³º°Àû obstackµéÀº ´Ù¸¥°Í¿¡ µ¶¸³ÀûÀÌ´Ù.
ÇØÁ¦¿¡ °üÇÑ ÇϳªÀÇ Á¦¾à¸»°í´Â obstackµéÀº ÀüüÀûÀ¸·Î ÀϹÝÀûÀÌ´Ù; obstack´Â ¾î´À Å©±âÀÇ object µéÀ» ¸î °³¶óµµ ÀúÀåÇÒ¼ö ÀÖ´Ù. ±×µéÀº ¸¶Å©·Î·Î ½ÇÇàµÇ°í ±×·± ÇÒ´çÀº object°¡ º¸Åë À۾Ƽ, ¸Å¿ì ºü¸£´Ù. ±×¸®°í Àû´çÇÑ °æ°èÀ§¿¡ °¢ object¸¦ ½ÃÀÛÇϱâ À§ÇØ ÇÊ¿äÇÑ °ø°£ÀÌ Àִµ¥ ±×°ÍÀº °¢ ´ë»ó ¸¶´Ù µ¡ºÙ¿© ÀÖ´Ù.
3.4.1 Obstacks ¸¸µé±â
obstacks¸¦ ´Ù·ç±â À§ÇÑ À¯Æ¿¸®Æ¼µéÀº Çì´õÆÄÀÏ 'obstack.h'¿¡ Á¤ÀǵǾî ÀÖ´Ù.
struct obstack Data Type
obstack´Â ±¸Á¶Ã¼ obstackÀÇ Å¸ÀÔÀ¸·Î µ¥ÀÌÅÍ ±¸Á¶¸¦ ³ªÅ¸³½´Ù. ÀÌ ±¸Á¶´Â ÀÛÀº Á¤ÇØÁø Å©±â¸¦ °¡Áø ´Ù; °¢ ·¹ÄÚµåµéÀº obstackÀÇ »óȲ°ú ÇÒ´çµÈ °÷¿¡¼ °ø°£À» ¾î¶»°Ô ¹ß°ßÇÒ°ÍÀΰ¡¸¦ ³ªÅ¸³½´Ù. ±×·¯ ³ª obstack´Â objectÀÚü¸¦ Æ÷ÇÔÇÏÁö´Â ¾Ê´Â´Ù. ´ç½ÅÀº Á÷Á¢ÀûÀ¸·Î ±× ±¸Á¶Ã¼ÀÇ ³»¿ëÀ» °Ë»öÇÏ·Á°í ½ÃµµÇÒ¼ö ¾ø´Ù.; ¿ÀÁ÷ ÀÌ Àå¿¡¼ ¼³¸íÇÏ´Â ÇÔ¼öµéÀ» »ç¿ëÇ϶ó.
´ç½ÅÀº struct obstack ŸÀÔÀ¸·Î º¯¼öµéÀ» ¼±¾ðÇÒ¼ö ÀÖ°í obstackµéó·³ ±×µéÀº »ç¿ëÇÒ¼ö ÀÖ´Ù. ¶Ç ÇÑ ´Ù¸¥ Á¾·ùÀÇ objectó·³ µ¿ÀûÀ¸·Î obstackµéÀ» ÇÒ´çÇÒ¼ö ÀÖ´Ù. obstackÀÇ µ¿Àû ÇÒ´çÀº ¸î °³ÀÇ ´Ù¸¥ ½ºÅÃÀ» °¡Áø ÇѺ¯¼ö¸¦ °¡Áú¼ö ÀÖµµ·Ï ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡°Ô Çã¿ëÇÑ´Ù. ( ´ç½ÅÀº ½ÉÁö¾î ÇÑ obstack¾È¿¡ ´Ù¸¥ obstack±¸Á¶¸¦ ÇÒ´çÇÒ¼ö ÀÖ´Ù. ÇÏÁö¸¸ À̰ÍÀº ±×¸® À¯¿ëÇÏÁö´Â ¾Ê´Ù. )
´ç½ÅÀÌ »ç¿ëÇϱâ À§ÇØ obstack¸¦ ¿äûÇϱâ À§Çؼ´Â obstack·Î ±×¿Í °°Àº ÀÏÀ» ÇÏ´Â ¸ðµç ÇÔ¼öµé ÀÌ ÇÊ¿äÇÏ´Ù. ´ç½ÅÀº struct obstack * ŸÀÔÀÇ Æ÷ÀÎÅÍ·Î À̰ÍÀ» ÇÑ´Ù. µû¶ó¼ ¿ì¸®°¡ Á¾Á¾ "an obstack"¶ó°í ¸»ÇÒ ¶§ ¾ö°ÝÈ÷ ¸»ÇÏ¸é ±×°ÍÀº Æ÷ÀÎÅÍ¿Í °°´Ù.
obstack¾È¿¡ objectµéÀº ûũ(chunks)¶ó°í ºÒ¸®´Â Å« ºí·Ïµé ¾È¿¡ ²Ù·ÁÁ® ÀÖ´Ù. ±¸Á¶Ã¼ obstack´Â ÇöÀç »ç¿ëµÇ°í Àִ ûũµéÀÇ ¿¬°áÀ» Æ÷ÀÎÅÍ·Î ±¸¼ºÇÑ´Ù.
obstack ¶óÀ̺귯¸®´Â ´ç½ÅÀÌ ¾ÕÀÇ Ã»Å©¿¡ ³Ö±â ¿øÇÏÁö ¾Ê´Â object¸¦ ÇÒ´çÇÒ¶§¸¶´Ù »õ·Î¿î ûũ ¸¦ ¸¸µç´Ù. obstack ¶óÀ̺귯¸®°¡ ûũ¸¦ °ü¸® ÇϹǷΠ´ç½ÅÀº ûũ¿¡°Ô ¸¹Àº ÁÖÀǸ¦ ½ñÀ» ÇÊ¿ä´Â ¾øÁö¸¸ ûũ¸¦ ¾ò¾î¼ »ç¿ëÇÏ´Â ÇÔ¼ö¸¦ °ø±ÞÇØÁÙ ÇÊ¿ä´Â ÀÖ´Ù. º¸Åë ´ç½ÅÀº Á÷Á¢ÀûÀ̰ųª °£Á¢ÀûÀÌ °Ô mallocÀ» »ç¿ëÇÏ´Â ÇÔ¼ö¸¦ °ø±ÞÇÑ´Ù. ´ç½ÅÀº ûũ¸¦ ÇØÁ¦Çϱâ À§Çؼµµ ÇÔ¼ö¸¦ °ø±ÞÇØ¾ß¸¸ ÇÑ´Ù. ÀÌ ¹®Á¦µéÀº ´ÙÀ½Àý¿¡ ¼³¸íµÇ¾î ÀÖ´Ù.
3.4.2 ObstackµéÀº »ç¿ëÇϱâ À§ÇÑ Áغñ
´ç½ÅÀÌ obstack¸¦ »ç¿ëÇÏ·Á°í °èȹÇß´Ù¸é °¢ ¼Ò½ºÆÄÀϾȿ¡ 'obstack.h'¶ó´Â Çì´õÆÄÀÏÀ» Æ÷ÇÔÇØ¾ß¸¸ ÇÑ´Ù. À̰ÍÀº ´ÙÀ½°ú °°´Ù.
#include <obstack.h>
¶ÇÇÑ ¼Ò½ºÆÄÀÏ¿¡ ¸ÅÅ©·Î obstack_init¸¦ »ç¿ëÇÑ´Ù¸é obstack ¶óÀ̺귯¸®¿¡ ÀÇÇØ ºÒ¸®¿öÁú ¸ÅÅ©·Î³ª µÎ °³ÀÇ ÇÔ¼ö¸¦ ¼±¾ðÇϰųª Á¤ÀÇÇØ¾ß¸¸ ÇÑ´Ù. Çϳª´Â obstack_chunk_allocÀ¸·Î ¸ð¾ÆÁ®ÀÖ´Â( are packed) objectµé¿¡ ¸Þ¸ð¸®ÀÇ Ã»Å©¸¦ ÇÒ´çÇϱâ À§ÇØ »ç¿ëµÇ´Â °ÍÀÌ´Ù. ´Ù¸¥ Çϳª´Â obstack_chunk_free·Î ûũ¿¡¼ objectµéÀ» ÇØÁ¦Çϰí ûũ¸¦ ¹ÝȯÇϴµ¥ »ç¿ëÇÑ´Ù.
º¸Åë À̵éÀº xmalloc À̶ó´Â ¸Å°³ÀÚ¸¦ °ÅÃÄ mallocÀ» »ç¿ëÇϵµ·Ï Á¤ÀǵǾî ÀÖ´Ù. ( 3.3Àå [Unconstrained Allocation] 22ÆäÀÌÁö¸¦ ÂüÁ¶) À̰ÍÀº ¹Ø¿¡ ÀÖ´Â µÎ °³ÀÇ ¸ÅÅ©·Î Á¤ÀÇ·Î ÇÑ´Ù.
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free
´ç½ÅÀÌ obstackµéÀ» »ç¿ëÇÏ¸é¼ ¾ò¾î³½ ÀúÀå°ø°£Àº ½ÇÁ¦·Î mallocÀ» ÅëÇØ ÇÒ´çµÈ °ÍÀ̰í, obstak ¸¦ »ç¿ëÇÏ´Â°Ç ¸Þ¸ð¸®ÀÇ Å« ºí·ÏµéÀº ´ú ÀÚÁÖ È£ÃâÇϱ⠶§¹®¿¡ Á»´õ ºü¸£´Ù.
½ÇÇà½Ã ÇÁ·Î±×·¥ÀÌ obstack·Î struct obstackŸÀÔÀÎ object¸¦ »ç¿ëÇϱâÀü¿¡ obstack_init¸¦ È£ÃâÇØ¼ obstack¸¦ ÃʱâÈ ÇØ¾ß¸¸ ÇÑ´Ù.
ÇÔ¼ö void obstack__init (struct obstack *obstack_ptr)
objectÀÇ ÇÒ´çÀ» À§ÇØ obstack_ptrÀ» ÃʱâÈ
¿©±â¿¡ obstack¸¦ À§ÇØ ¾î¶»°Ô °ø°£À» ÇÒ´çÇÏ°í ±×°ÍÀ» ÃʱâÈ ÇÏ´Â µÎ°¡Áö ¿¹°¡ ÀÖ´Ù.
ù ¹øÂ°, ½ºÅú¯¼öÀÎ obstack:
static struct obstack myobstack;
. . .
obstack_init (&myobstack);
µÑ°·Î obstack ±×ÀÚ½ÅÀÌ µ¿ÀûÀ¸·Î ÇÒ´çµÇ´Â °Í:
struct obstack *myobstack_ptr
= (struct obstack *) xmalloc (sizeof (struct obstack));
obstack_init (myobstack_ptr);
3.4.3 Obstack¿¡¼ ÇÒ´ç
obstack¿¡ object¸¦ ÇÒ´çÇϱâ À§ÇÑ °¡Àå Á÷Á¢ÀûÀÎ ¹æ¹ýÀ» obstack_allocÀ» »ç¿ëÇÏ´Â °Çµ¥ À̰ÍÀº °ÅÀÇ malloc°ú °°´Ù.
ÇÔ¼ö void * obstack__alloc (struct obstack *obstack_ptr, size_t size)
¸î¹ÙÀÌÆ®ÀÇ Å©±âÀÎÁö ÃʱâÈ µÇÁö ¾ÊÀº ÇÒ´çÀº ±× ÀÚ½ÅÀÇ ÁÖ¼Ò°ªÀ» ¸®ÅÏÇÑ´Ù. ¿©±âÀÇ obstack_ptrÀº ¾È¿¡ ºí·ÏÀ» ÇÒ´çÇϱâ À§ÇÑ obstackÀ» ÁöÁ¤ÇÑ´Ù.; ±×°ÍÀº obstack·Î Ç¥ÇöµÈ struct obstack ŸÀÔÀÇ objectÀÇ ÁÖ¼ÒÀÌ´Ù. °¢°¢ÀÇ obstack ÇÔ¼ö³ª ¸ÅÅ©·Î´Â ´ç½Å¿¡°Ô ù ¹øÂ° ÀÎÀÚ·Î obstack_ptrÀ» ÁöÁ¤ÇÒ °ÍÀ» ¿äûÇÑ´Ù.
¿©±âÀÇ ¿¹´Â Á¤ÇØÁø obstack, Áï º¯¼ö string_obstack¾È¿¡ ¹®ÀÚ¿À» ÇÒ´çÇϱâ À§ÇÑ ÇÔ¼ö¸¦ º¸¿©ÁØ ´Ù.
/*¶Ç ¿ª½Ã Á¦°¡ ÁÖ¼®À» Á» ºÙ¿© º¸Áö¿ä.. ÇìÇì..*/
struct obstack string_obstack;
/* struct obstack ÇüÀ¸·Î string_obstackº¯¼ö¸¦ ¼±¾ðÇ߳׿ä. */
char * copystring (char *string)
{
char *s = (char *) obstack_alloc (&string_obstack, strlen (string) + 1);
/* ¾Æ±î À§¿¡¼ obstack_allocÀÌ °ÅÀÇ malloc °ú °°´Ù°í ÇßÁö¿ä..? ±×·¯´Ï±î ¹®ÀÚ¿À» À§ÇØ °ø°£À» ÇÒ´ç¹Þ±â À§Çؼ´Â ±æÀÌ +1 ÇØ¼ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϸé s·Î ¹ÞÁö¿ä...*/
memcpy (s, string, strlen (string));
/* À§¿¡¼ ¹ÞÀº Æ÷ÀÎÅÍ s¿¡ string À» ±æÀ̸¸Å º¹»ç */
return s; /* ±×¸®°í ¸®ÅÏ...*/
}
Á¤ÇØÁø ³»¿ëÀ» °®Àº ºí·ÏÀ» ÇÒ´çÇϱâ À§Çؼ´Â obstack_copy ÇÔ¼ö¸¦ »ç¿ëÇ϶ó. À̰ÍÀº ´ÙÀ½°ú °° ÀÌ Á¤ÀÇÇÑ´Ù.
void * obstack__copy (struct obstack *obstack_ptr, void *address, size_t size)
À̰ÍÀº ºí·ÏÀ» ÇÒ´çÇÏ°í ±× ÁÖ¼Ò¿¡ ¹®ÀÚ¿À» Á¤ÇØÁø Å©±â´ë·Î º¹»çÇØ¼ ÃʱâÈ Çϴ°ÍÀÌ´Ù.
void * obstack__copy0 (struct obstack *obstack_ptr, void *address, size_t size)
obstack_copy¿Í °°Áö¸¸ ³Î ¹®ÀÚ¸¦ Æ÷ÇÔÇÏ´Â ÇϳªÀÇ ¿©ºÐÀÇ ¹ÙÀÌÆ®¸¦ µ¡ºÙÀδÙ. ÀÌ ¿©ºÐÀÇ ¹ÙÀÌÆ® ´Â ÀμöÅ©±â¿¡´Â µé¾î°¡Áö ¾Ê´Â´Ù.
ÀÌ obstack_copy() ÇÔ¼ö´Â ³Î¹®ÀÚ·Î ³¡³ª´Â ¹®ÀÚ¿°ú °°Àº ¹®ÀÚÀÇ ¿µéÀ» obstack¿¡ ³Ö±â¿¡´Â Æí ¸®ÇÑ ÇÔ¼ö´Ù. »ç¿ë¿¹¸¦ º¸¸é:
char * obstack_savestring (char *addr, size_t size)
{
return obstack_copy0 (&myobstack, addr, size);
}
mallocÀ» »ç¿ëÇÑ ¾ÕÀÇ stvestring ÀÇ ¿¹¿Í ºñ±³Çغ¸¶ó (3.3.1ÀýÀÇ [Basic Allocation]À» º¸¶ó)
3.4.4 Obstack¿¡¼ Objects ÇØÁ¦Çϱâ
obstack¾È¿¡ ÇÒ´çµÈ object¸¦ ÇØÁ¦Çϱâ À§Çؼ´Â obstack_freeÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. objectµéÀÇ ½ºÅÃÀÎ obstack´Â ÇÑ object°¡ ÇØÁ¦µÇ¸é ±× objectÀÌÈÄ ÃÖ±Ù¿¡ °°Àº obstack¿¡ ÇÒ´çµÈ ´Ù¸¥ objectµéµµ ÀÚµ¿ ÀûÀ¸·Î ÇØÀç ½ÃŲ´Ù.
ÇÔ¼ö obstack__free (struct obstack *obstack_ptr, void *object)
¸¸¾à object°¡ ³Î Æ÷ÀÎÅÍ À̸é obstack¾È¿¡ ÇÒ´çµÈ ¸ðµç °ÍÀÌ ÇØÁ¦µÈ´Ù. ±×·¸Áö ¾ÊÀ¸¸é object´Â obstack¾È¿¡ ÇÒ´çµÈ objectÀÇ ÁÖ¼ÒÀÌ¿©¾ß¸¸ ÇÑ´Ù. ±×·¯¸é object´Â ÇØÁ¦µÇ°í ±× ÇØÁ¦µÈ objectÀÌÈÄ obstack¾È¿¡ ÇÒ´çµÈ ¸ðµç °Íµµ µû¶ó¼ ÇØÁ¦µÈ´Ù.
object¿¡ ³Î Æ÷ÀÎÅ͸¦ ÁÖ¸é ±× °á°ú´Â obstackÀÇ ºñÃʱâȶó´Â °ÍÀ» ¾Ë¾Æ¶ó. obstack¾È¿¡ ¸ðµç ³» ¿ëÀº ÇØÁ¦ÇÏÁö¸¸ ´ÙÀ½ ÇÒ´çÀ» À§ÇØ obstack¸¦ À¯¿ëÇÏ°Ô ³²±â°í ½Í´Ù¸é obstack¿¡ ÇÒ´çµÈ objectÀÇ Ã¹ ¹øÂ° ÁÖ¼Ò¸¦ ÁÖ¾î obstack_free¸¦ È£ÃâÇÏ¸é µÈ´Ù.
ûũ¾È¿¡ ¸ð¾ÆÁø obstack¾ÈÀÇ objectµéÀº Àç È£ÃâÇ϶ó. ûũ¾È¿¡ objectµéÀº ¸ðµÎ ÇØÁ¦ÇÒ ¶§ ±× obstack ¶óÀ̺귯¸®´Â ÀÚµ¿ÀûÀ¸·Î ûũ¸¦ ÇØÁ¦ÇÑ´Ù. ( 3.4.2Àý [Preparing for Obstacks] 29ÆäÀÌÁö Âü Á¶) ±×·¯¸é ´Ù¸¥ obstackµéÀ̳ª ºñ obstack ÇÒ´çµµ ±× ûũÀÇ °ø°£À» Àç»ç¿ë ÇÒ¼ö ÀÖ´Ù.
3.4.5 Obstack ÇÔ¼ö¿Í ¸ÅÅ©·Î
obstackµéÀÇ »ç¿ëÀ» À§ÇÑ ÀÎÅÍÆäÀ̽º´Â ÄÄÆÄÀÏ·¯¿¡ ÀÇÁ¸ÇÏ´Â ÇÔ¼ö³ª ¸ÅÅ©·Î·Î Á¤ÀǵǾî Áø´Ù. ¸ð µç C ÄÄÆÄÀÏ·¯´Â ANSI C¿Í ÀüÅëÀûÀÎ C¸¦ Áö¿øÇÏ´Â obstack µµ±¸¸¦ °¡Áö°í ÀÖ´Ù. ÇÏÁö¸¸ ´ç½ÅÀÌ GNU C º¸´Ù´Â ´Ù¸¥ ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇÏ·Á ÇÑ´Ù¸é ¸¹Àº ÁÖÀǸ¦ ÇØ¾ßÇÑ´Ù.
¸¸¾à ´ç½ÅÀÌ ¿À·¡µÈ ºñ ANSI C ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇÏ¸é ¸ðµç obstack ÇÔ¼öµéÀº ¸ÅÅ©·Î·Î Á¤À§µÇ¾î ÀÖ´Ù. ´ç½ÅÀº ÀÌ ¸ÅÅ©·Î¸¦ ÇÔ¼öµéó·³ È£Ãâ ÇÒ ¼ö ÀÖÁö¸¸ ´ç½ÅÀº ±×°ÍÀ» ´Ù¸¥ ¹æ¹ýÀ¸·Î´Â »ç¿ëÇÒ¼ö ¾ø´Ù.( ¿¹¸¦ µé¾î, ±×µéÀÇ ÁÖ¼Ò¸¦ ÁÙ¼ö ¾ø´Ù. )
¸ÅÅ©·ÎÀÇ È£ÃâÀº Ưº°ÇÑ ÁÖÀǰ¡ ¿ä±¸µÈ´Ù.; Áï, ù ¹øÂ° ÇÇ¿¬»êÀÚ ( obstack Æ÷ÀÎÅÍ)°¡ ºÎÀÛ¿ëÀ» Æ÷ÇÔÇϰí ÀÖ´Ù°í ÇÒ¼ö ÀÖÀ»Áöµµ ¸ð¸£´Âµ¥, ±×°ÍÀº ±×°ÍÀÌ ¿©·¯¹ø ¿¬»êµÇ±â ¶§¹®ÀÌ´Ù. ¿¹¸¦ µé¾î ¸¸ ¾à ´ç½ÅÀÌ ¾Æ·¡Ã³·³ ¾²¸é;
obstack_alloc (get_obstack (), 4);
´ç½ÅÀº ¿©·¯¹ø get_obstack°¡ È£ÃâµÇ´Â°É ¹ß°ßÇÒ¼ö ÀÖ´Ù. ¸¸¾à ´ç½ÅÀÌ obstack Æ÷ÀÎÅÍ ÀÎÀÚó·³ *obstack_list_prt++À» »ç¿ëÇÏ¸é ¿©·¯¹ø Áõ°¡°¡ ¹ß»ýÇÏ¿© ÀÌ»óÇÑ °á°ú¸¦ ¾òÀ» °ÍÀÌ´Ù.
ANSI C´Â ÇÔ¼ö¿Í ¸ÅÅ©·Î Á¤ÀÇ µÑÀ» ´Ù Áö¿øÇÑ´Ù. ÇÔ¼ö Á¤ÀÇ´Â ±×°ÍÀ» È£ÃâÇÏÁö ¾Ê°í ÇÔ¼öÀÇ ÁÖ¼Ò ·Î »ç¿ëµÇ´Â °ÍÀÌ´Ù. º¸ÅëÀÇ È£ÃâÀº ¾Ï¹¬ÀûÀ¸·Î ¸¶Å©·Î Á¤Àǰ¡ »ç¿ëµÇÁö¸¸ ´ç½ÅÀº °ýÈ£¾È¿¡ ÇÔ¼öÀÇ À̸§À» ¾¸À¸·Î½á ÇÔ¼öÁ¤ÀǸ¦ ¿äûÇÒ¼ö ÀÖ´Ù.
¾Æ·¡Ã³·³;
char *x;
void *(*funcp) ();
/* ¸¶Å©·Î »ç¿ë */
x = (char *) obstack_alloc (obptr, size);
/* ÇÔ¼ö È£Ãâ */
x = (char *) (obstack_alloc) (obptr, size);
/* ÇÔ¼öÀÇ ÁÖ¼Ò¸¦ ÃëÇ϶ó */
funcp = obstack_alloc;
À̰ÍÀº Ç¥ÁØ ¶óÀ̺귯¸® ÇÔ¼ö¸¦ À§ÇÑ ANSI C¾È¿¡ ÀÖ´Â °Í°ú °°´Ù. 1.3.2Àý[Macro Definitions] 4ÆäÀÌ Áö¸¦ º¸¶ó.
ÁÖÀÇ: ½ÉÁö¾î ANSI C ¿¡¼ Á¶Â÷µµ ù ¹øÂ° ÇÇ¿¬»êÀÚÀÇ ºÎÀÛ¿ëÀ» ÇÇÇϴµ¥ ÁÖÀǸ¦ ±â¿ï¿©¾ß ÇÑ´Ù.
¸¸¾à ´ç½ÅÀÌ GNU C ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇϰí ÀÖ´Ù¸é ÀÌ ÁÖÀÇ´Â ÇÊ¿äÇÏÁö ¾Ê´Âµ¥, ±×°ÍÀº GNU C¾È¿¡ ´Ù ¾çÇÑ ¾ð¾îÀÇ È®ÀåÀº ¿ÀÁ÷ ÇÑ ¹ø °¢ Àμö¸¦ ½ÇÇàÇϵµ·Ï ±× ¸¶Å©·Î¸¦ Á¤ÀÇÇÏ´Â °ÍÀ» Çã¿ëÇÑ´Ù.
3.4.6 ¼ºÀåÇÏ´Â ´ë»ó¹°
obstack µ¢¾î¸® ³»ÀÇ ÀúÀå¼Ò´Â ¿¬¼ÓÀûÀ¸·Î »ç¿ëµÇ±â ¶§¹®¿¡ ¾î¶² ´ë»ó¹°À» Â÷·Ê·Î ½×¾Æ¼ ´ë»ó¹°ÀÇ ³¡¿¡ Çѹø¿¡ Çϳª ¶Ç´Â ±× ÀÌ»óÀÇ ¹ÙÀÌÆ®¸¦ Ãß°¡ÇÒ ¼ö ÀÖ´Ù.ÀÌ ±â¹ýÀ» »ç¿ëÇÔ¿¡ ÀÖ¾î ´ç½ÅÀº ±× ´ë »ó¹°ÀÇ ³¡¿¡ ´Ù´Ù¸¦ ¶§ ±îÁö ±× ´ë»ó¹°¿¡ ¾ó¸¶¸¸ÅÀÇ µ¥ÀÌÅ͸¦ ³ÖÀ» ¼ö ÀÖ´ÂÁö¸¦ ¾Ë Çʿ䰡 ¾ø´Ù.
À̰ÍÀº ¼ºÀåÇÏ´Â ´ë»ó¹° ±â¹ýÀ̶ó ºÒ¸°´Ù.¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ µ¥ÀÌÅ͸¦ Ãß°¡Çϴ Ư¼öÇÑ ÇÔ¼öµéÀº ÀÌ Àý¿¡ ±â¼úµÇ¾î ÀÖ´Ù.
´ç½ÅÀº ¾î¶² ´ë»ó¹°À» ¼ºÀå½ÃŰ±â ½ÃÀÛÇÒ ¶§ ¾Æ¹«·± Ưº°ÇÑ Á¶Ä¡µµ ÇÒ Çʿ䰡 ¾ø´Ù.±× ´ë»ó¹°¿¡ µ¥ ÀÌÅ͸¦ Ãß°¡½ÃŰ´Â ÇÔ¼öµé ÁßÀÇ Çϳª¸¦ »ç¿ëÇÏ°Ô µÇ¸é ±×°ÍÀº ÀÚµ¿ÀûÀ¸·Î ½ÃÀ۵ȴÙ. ±×·¯³ª ±× ´ë»ó ¹°ÀÌ ³¡³¯ ¶§¿¡´Â ºÐ¸íÇÏ°Ô ¸»ÇØ ÁÙ Çʿ䰡 ÀÖ´Ù.À̰ÍÀº ÇÔ¼ö obstack_finish¿¡ ÀÇÇØ ¼öÇàµÈ´Ù.
ÀÌ·¸°Ô ÇØ¼ ¸¸µé¾îÁø ´ë»ó¹°ÀÇ ½ÇÁ¦ ÁÖ¼Ò´Â ±×°ÍÀÌ ³¡³ª±â Àü¿¡´Â ¾Ë ¼ö°¡ ¾ø´Ù. ±×¶§±îÁö´Â Ç×»ó ´ë»ó¹°ÀÌ »õ·Î¿î µ¢¾î¸® ¼ÓÀ¸·Î º¹»çµÇ¾î¾ß ÇÒ ¸¸ÅÀÇ µ¥ÀÌÅ͸¸ÀÌ Ãß°¡µÉ ¼ö ÀÖÀ» »ÓÀÌ´Ù.
obstackÀÌ ¼ºÀåÇÏ´Â ´ë»ó¹°À» À§ÇØ »ç¿ëµÇ°í ÀÖÀ» µ¿¾È¿¡´Â ´ç½ÅÀº ´Ù¸¥ ´ë»ó¹°À» ÇÒ´çÇϱâ À§Çؼ ±×°ÍÀ» »ç¿ëÇÒ ¼ö´Â ¾ø´Ù. ¸¸¾à ±×·¸°Ô ÇÑ´Ù¸é,ÀÌ¹Ì ¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ Ãß°¡µÈ °ø°£ÀÌ ´Ù¸¥ ´ë»ó¹° ÀÇ ÀϺκÐÀ¸·Î µÇ¾î¹ö¸± °ÍÀÌ´Ù.
ÇÔ¼ö void obstack__blank (struct obstack *obstack_ptr, size_t size)
¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ Ãß°¡Çϱâ À§ÇÑ °¡Àå ±âÃÊÀûÀÎ ÇÔ¼ö´Â obstack_blankÀ̸ç,À̰ÍÀº ´ë»ó¹°À» Ãʱâ ÈÇÏÁö ¾Ê°í °ø°£À» Ãß°¡ÇÑ´Ù.
ÇÔ¼ö void obstack__grow (struct obstack *obstack_ptr, void *data, size_t size)
ÇÑ ºí·°ÀÇ ÃʱâÈµÈ °ø°£À» »ç¿ëÇÏ·Á¸é,obstack_grow¸¦ »ç¿ëÇ϶ó.obstack_grow´Â ¼ºÀåÇÏ´Â ´ë»ó¹° ¿¡ À־ obstack_copy¿Í À¯»çÇÏ´Ù.obstack_grow´Â ¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ size ¹ÙÀÌÆ®ÀÇ µ¥ÀÌÅ͸¦ Ãß°¡ÇÏ°í µ¥ÀÌÅͷκÎÅÍ ±× ³»¿ëÀ» º¹»çÇÑ´Ù.
ÇÔ¼ö void obstack__grow0 (struct obstack *obstack_ptr, void *data, size_t size)
À̰ÍÀº ¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ ÀÖ¾î¼ obstack_copy0¿Í À¯»ç ÇÏ´Ù. ±×°ÍÀº ³Î(null) ¹®ÀÚ°¡ µû¶ó¿À´Â µ¥ ÀÌÅÍ¿¡¼ º¹»çÇÑ size ¹ÙÀÌÆ®¸¦ Ãß°¡ÇÑ´Ù.
ÇÔ¼ö void obstack__1grow (struct obstack *obstack_ptr, char c)
Çѹø¿¡ ÇϳªÀÇ ¹®ÀÚ¸¦ Ãß°¡ÇÏ·Á¸é ÇÔ¼ö obstack__1grow¸¦ »ç¿ëÇ϶ó. ±×°ÍÀº ¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ c¸¦ ´ã¾ÆµÑ 1 ¹ÙÀÌÆ®¸¦ Ãß°¡ÇÑ´Ù.
ÇÔ¼ö void * obstack__finish (struct obstack *obstack_ptr)
´ç½ÅÀÌ ´ë»ó¹° ¼ºÀå½Ã۱⸦ ³¡¸¶ÃÆÀ» ¶§ ÇÔ¼ö obstack_finish¸¦ »ç¿ëÇØ¼ ±×°ÍÀ» ´Ý°í ±×°ÍÀÇ ¸¶Áö ¸· ÁÖ¼Ò¸¦ ¹ÝȯÇ϶ó.´ç½ÅÀÌ ±× ´ë»ó¹°À» ¿Ï·áÇϸé,obstackÀº ¶Ç´Ù¸¥ ´ë»ó¹°À» ÇÒ´çÇϰųª ¼ºÀå½ÃŰ´Â µ¥ »ç¿ëµÉ ¼ö ÀÖ°Ô µÈ´Ù. ´ç½ÅÀÌ ÇϳªÀÇ ´ë»ó¹ÉÀ» ¼ºÀå½ÃÄѼ ¸¸µé°Ô µÇ¸é, ±×°ÍÀÌ ¾ó¸¸Å ±æ¾îÁ³´Â Áö¸¦ ³ªÁß¿¡ ¾Ë Çʿ䰡 »ý±æ °ÍÀÌ´Ù. ´ç½ÅÀº ±× ´ë»ó¹°ÀÌ ¼ºÀåÇÏ´Â µ¿¾È¿¡´Â ±× °úÁ¤À» ÃßÀûÇÒ ÇÊ ¿ä°¡ ¾ø´Ù.¿Ö³ÄÇÏ¸é ´ç½ÅÀº ÇÔ¼ö obstack_object_size¸¦ »ç¿ëÇÏ¿© ±× ´ë»ó¹°ÀÇ ¿Ï·á Á÷Àü¿¡ obstack À¸·ÎºÎÅÍÀÇ ±æÀ̸¦ ¾Ë ¼ö Àֱ⠶§¹®ÀÌ´Ù.±×°ÍÀº ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÈ´Ù.
ÇÔ¼ö size_t obstack__object__size (struct obstack *obstack_ptr)
ÀÌ ÇÔ¼ö´Â ¼ºÀåÇÏ´Â ´ë»ó¹°ÀÇ ÇöÀç Å©±â¸¦ ¹ÙÀÌÆ®¼ö·Î ¹Ýȯ ÇÑ´Ù.ÀÌ ÇÔ¼ö´Â ´ë»ó¹°ÀÌ ¿Ï·áµÇ±â Àü ¿¡ È£ÃâÇÏ¿©¾ß ÇÔÀ» ±â¾ïÇ϶ó.¿Ï·áµÇ°í ³ ´ÙÀ½¿¡´Â ÀÌ ÇÔ¼ö´Â Á¦·Î¸¦ ¹ÝȯÇÒ °ÍÀÌ´Ù.
¸¸¾à ´ç½ÅÀÌ ´ë»ó¹° ¼ºÀå½Ã۱⸦ ½ÃÀÛÇÑ ´ÙÀ½¿¡ À̸¦ Ãë¼ÒÇÏ°í ½Í´Ù¸é,´ç½ÅÀº ÀÌ·¸°Ô ³¡³»°í ÇØÁ¦ Ç϶ó;
obstack_free (obstack_ptr,obstack_finish (obstack_ptr));
À̰ÍÀº ¾Æ¹«·± ´ë»ó¹°µµ ¼ºÀåÇϰí ÀÖÁö ¾ÊÀ» ¶§¿¡´Â ¾Æ¹«·± È¿°úµµ ¾ø´Â °ÍÀÌ´Ù.
ÇöÀçÀÇ ´ë»ó¹°À» ÀÛ¾ÆÁö°Ô ¸¸µé°í ½ÍÀ¸¸é À½¼öÀÇ size Àμö¸¦ °®´Â obstack_blank¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ±× ´ë»ó¹° ÀÚü¸¦ À½¼ö Å©±â·Î ¸¸µé·Á°í ÇÏÁö´Â ¸»¾Æ¾ß ÇÑ´Ù. ±×·¸°ÔµÇ¸é ¹«½¼ ÀÏÀÌ ÀϾ ¸¥Áö ¾Ë ¼ö°¡ ¾ø´Ù.
3.4.7 ƯÈ÷ ±Þ¼ÓÇÏ°Ô ¼ºÀåÇÏ´Â ´ë»ó¹°
¼ºÀåÇÏ´Â ´ë»ó¹°À» ¸¸µå´Â Åë»óÀûÀÎ ÇÔ¼öµéÀº ÇöÀçÀÇ ¸Þ¸ð¸® µ¢¾î¸®¿¡ »õ·Î¿î ¼ºÀåÀ» À§ÇÑ °ø°£ÀÌ ÀÖ´ÂÁö¸¦ üũÇϱâ À§ÇÏ¿© ºÎ°¡¹°À» ÃÊ·¡ÇÑ´Ù.¸¸¾à ´ç½ÅÀÌ ´ë»ó¹°À» Á¶±Ý¾¿ ´Ü°èº°·Î ¸¸µé°íÀÚ ÇÑ ´Ù¸é ÀÌ ºÎ°¡¹°Àº Áß¿äÇÑ °ÍÀÌ µÉ ¼ö ÀÖ´Ù.
´ç½ÅÀº üũÇÏÁö ¾Ê°í ´ë»ó¹°À» ¼ºÀå½ÃŰ´Â Ư¼öÇÑ "±Þ¼ÓÇÑ ¼ºÀå" ÇÔ¼ö¸¦ »ç¿ëÇÔÀ¸·Î½á ºÎ°¡¹°À» ÁÙ ÀÏ ¼ö ÀÖ´Ù. °ß½ÇÇÑ ÇÁ·Î±×·¥À» ¸¸µé±â À§Çؼ´Â ´ç½Å ÀÚ½ÅÀÌ Ã¼Å©¸¦ ¼öÇàÇØ¾ß¸¸ ÇÑ´Ù.¸¸¾à ´ç½Å ÀÌ ´ë»ó¹°¿¡ µ¥ÀÌÅ͸¦ Ãß°¡ÇÏ·Á ÇÒ ¶§¸¶´Ù °¡Àå °£´ÜÇÑ ¹æ¹ýÀ¸·Î ÀÌ·¯ÇÑ Ã¼Å©¸¦ ¼öÇàÇÏ·Á ÇÑ´Ù ¸é,´ç½ÅÀº ¾Æ¹« °Íµµ ÀúÀåÇÏÁö ¾Ê¾Æµµ Åë»óÀûÀÎ ¼ºÀå ÇÔ¼öµéÀÌ À̸¦ ÇàÇÒ °ÍÀÌ´Ù. ±×·¯³ª ´ç½ÅÀÌ Ã¼ Å©ÀÇ È½¼ö¸¦ ÁÙÀÌµÇ ´õ È¿°úÀûÀ¸·Î üũÇÒ ¼ö ÀÖµµ·Ï ¹è¿ÇÑ´Ù¸é, ´ç½ÅÀº ÇÁ·Î±×·¥À» ºü¸£°Ô ¸¸µå ´Â °ÍÀÌ µÈ´Ù.
ÇÔ¼ö obstack_roomÀº ÇöÀçÀÇ ¸Þ¸ð¸® µ¢¾î¸®¿¡¼ »ç¿ë°¡´ÉÇÑ °ø°£ÀÇ ¾çÀ» ¹ÝȯÇÑ´Ù.±×°ÍÀº ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÈ´Ù:
size_t obstack__room (struct obstack *obstack_ptr)
À̰ÍÀº °¡Àå ºü¸¥ ¼ºÀå ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â obstack¿¡¼ ÇöÀçÀÇ ¼ºÀåÇÏ´Â ´ë»ó¹°(¶Ç´Â ½ÃÀÛÇÏ·ÁÇÏ´Â ´ë »ó¹°)¿¡ ¾ÈÀüÇÏ°Ô Ãß°¡ÇÒ ¼ö ÀÖ´Â ¹ÙÀÌÆ® ¼ö¸¦ ¹ÝȯÇÑ´Ù.
°ø°£ÀÌ ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Â ÇÑ,´ç½ÅÀº ¾î¶² ¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ µ¥ÀÌÅ͸¦ Ãß°¡ÇÏ´Â ±Þ¼ÓÇÑ ¼ºÀå ÇÔ¼ö µéÀ» »ç¿ë ÇÒ ¼ö ÀÖ´Ù:
void obstack__1grow__fast (struct obstack *obstack_ptr, char c)
ÇÔ¼ö obstack_1grow_fast´Â ±¸Á¶Ã¼ obstackÀÇ Æ÷ÀÎÅÍ obstack_ptr¿¡¼ ¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ ¹®ÀÚ c¸¦ ´ã¾ÆµÑ 1 ¹ÙÀÌÆ®¸¦ Ãß°¡ÇÑ´Ù.
ÇÔ¼ö void obstack__blank__fast (struct obstack *obstack_ptr, size_t size)
ÇÔ¼ö obstack_blank_fast´Â ±¸Á¶Ã¼ obstackÀÎ obstack_ptr¿¡¼ ¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ size ¹ÙÀÌÆ®¸¦ ÃÊ ±âÈÇÏÁö ¾Ê°í Ãß°¡ÇÑ´Ù.
´ç½ÅÀÌ obstack_roomÀ» »ç¿ëÇÏ¿© °ø°£À» Ã¼Å©ÇØ¼ ´ç½ÅÀÌ Ãß°¡Çϱ⸦ ¿øÇÏ´Â ¸¸ÅÀÇ ÃæºÐÇÑ °ø°£ÀÌ ¾øÀ» ¶§´Â,±Þ¼ÓÇÑ ¼ºÀåÇÔ¼öµéÀº ¾ÈÀüÇÏ°Ô »ç¿ëÇÒ ¼ö°¡ ¾ø´Ù.ÀÌ·¯ÇÑ °æ¿ì¿¡´Â ±×Àú ÀûÇÕÇÑ Åë»óÀûÀÎ ¼ºÀåÇÔ¼ö¸¸À» »ç¿ëÇ϶ó. ÀÌ ÇÔ¼ö´Â °ð¹Ù·Î ´ë»ó¹°À» »õ·Î¿î ¸Þ¸ð¸® µ¢¾î¸®¿¡ º¹»çÇÑ´Ù;±×¸®°í³ª¸é ´Ù½Ã »ç¿ë°¡´ÉÇÑ °ø°£ÀÌ ¸¹ÀÌ ÀÖ°Ô µÉ °ÍÀÌ´Ù.
±×·¯°í ³ ´ÙÀ½¿¡,´ç½ÅÀÌ Åë»óÀûÀÎ ¼ºÀå ÇÔ¼ö¸¦ »ç¿ëÇÒ ¶§ ¸¶´Ù,ÇÔ¼ö »ç¿ë ÈÄ¿¡ obstack_roomÀ» ½á ¼ ÃæºÐÇÑ °ø°£ÀÌ ³²¾ÆÀÖ´ÂÁö¸¦ üũÇ϶ó.ÀÏ´Ü ´ë»ó¹°ÀÌ »õ·Î¿î µ¢¾î¸®·Î º¹»çµÇ°í³ª¸é ´Ù½Ã ÃæºÐÇÑ °ø°£ÀÌ »ý±æ °ÍÀ̰í,±×·¡¼ ÇÁ·Î±×·¥Àº ´Ù½Ã ±Þ¼ÓÇÑ ¼ºÀåÇÔ¼öµéÀ» »ç¿ëÇϱ⠽ÃÀÛÇÒ °ÍÀÌ´Ù.
¿¹¸¦ µé¾îº¸ÀÚ.
/*(1)ÇÔ¼ö¸í:add_string (2)Àμö1:±¸Á¶Ã¼ obstackÀ» Æ÷ÀÎÅÍ·Î ¼±¾ð (3)Àμö2:¹®ÀÚÆ÷ÀÎÅÍ ptrÀ» Àü´Þ*/
void add_string (struct obstack *obstack, char *ptr, size_t len)
{
while (len > 0)
/*ÇÔ¼ö Àüü ³»¿ëÀÌ °á±¹Àº while·çÇÁÀ̱º µû¶ó¼ Àμö lenÀº ¾ç¼ö¿©¾ß¸¸ Àǹ̰¡ ÀÖ±º*/
{
/* ÇÔ¼ö obstack_roomÀº ±× Àμö·Î ¹ÞÀº obstack ³»ÀÇ »ç¿ë°¡´ÉÇÑ
°ø°£À» ¹ÙÀÌÆ® ¼ö·Î ¹ÝȯÇÏ¹Ç ·Î ±× ¹ÙÀÌÆ® ¼ö°¡ lenº¸´Ù Å©¸é..ÈåÈå..°ø°£ÀÌ
ÀÖÁö¿©?*/
if (obstack_room (obstack) > len)
{
/* °ø°£ÀÌ ÃæºÐÇÏ¸é ±Þ¼ÓÇÑ ¼ºÀåÇÔ¼ö »ç¿ë*/
while (len-- > 0)
/* 1 ¸¸Å¾¿ Çì¾Æ¸®¸é¼ Àμö·Î Àü´Þ¹ÞÀº ¹®ÀÚ Æ÷ÀÎÅÍÀÇ ³»¿ëÀ» Çϳª¾¿ obstack¿¡ Ãß°¡½ÃŲ´Ù..±×·¯ ³ª ÀÌ ·çÇÁ°¡ ÀÛµ¿À» ¸¶Ä¥¶§¸é °á±¹Àº ÇѲ¨¹ø¿¡ Æ÷ÀÎÅÍÀÇ ¸ðµç ³»¿ëÀÌ Ãß°¡µÇ¾î ¹ö¸®´Â ¼ÀÀ̱º */
obstack_1grow_fast (obstack, *ptr++);
}
else
{
/* °ø°£ÀÌ ºÒÃæºÐÇÏ¸é ¼¼È÷ Çѹ®ÀÚ¸¦ Ãß°¡ÇÏ´Ù°¡ ±×°ÍÀ» »õ·Î¿î µ¢¾î¸®·Î º¹»çÇØ¼ °ø°£À» ¸¸µë */
obstack_1grow (obstack, *ptr++);
/* Áï, ÀÏ´Ü ÀμöÀÇ Æ÷ÀÎÅÍÀÇ 1¹®ÀÚ¸¦ obstack¿¡ Ãß°¡Çϰí */
len--;
/* lenÀ» 1¸¸Å ÁÙ¿©¼ obstack_roomÀÌ °ø°£À» ´Ù½Ã Æò°¡Çϵµ·Ï Çϴ±º¿ä.-->while·çÇÁ--> if¹®Àå À¸·Î º¹±Í */
}
}
/*while·çÇÁÀÇ ³¡ÁöÁ¡*/
}
/*ÇÔ¼ö ÀüüÀÇ ³¡ÁöÁ¡*/
3.4.8 obstack˂ ˤȗ
ÇϳªÀÇ obstack¿¡¼ ÇöÀçÀÇ ÇÒ´ç À§»ó¿¡ °üÇÑ Á¤º¸¸¦ Á¦°øÇÏ´Â ÇÔ¼öµéÀÌ ÀÖ´Ù. ´ç½ÅÀº ¼ºÀåÇϰí ÀÖ ´Â ´ë»ó¹°¿¡ ´ëÇØ¼ ¾Ë¾Æº¸±â À§Çؼ ±×°ÍµéÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÇÔ¼ö void * obstack__base (struct obstack *obstack_ptr)
ÀÌ ÇÔ¼ö´Â ±¸Á¶Ã¼ obstack_ptr¿¡¼ ÇöÀç ¼ºÀåÇÏ´Â ´ë»ó¹°ÀÇ Àӽà ½ÃÀÛÁÖ¼Ò¸¦ ¹ÝȯÇÑ´Ù.¸¸¾à ´ç½ÅÀÌ ±× ´ë»ó¹°À» Áï½Ã·Î Á¾°áÇÑ´Ù¸é ±×°ÍÀº ±× ÁÖ¼Ò¸¦ °¡Áú °ÍÀÌ´Ù.¹Ý´ë·Î ´ç½ÅÀÌ ±×°ÍÀ» ´õ Å©°Ô ¸¸µç ´Ù¸é ±×°ÍÀº ÇöÀçÀÇ µ¢¾î¸®º¸´Ù ´õ ¼ºÀåÇÒ °ÍÀÌ´Ù. ±×¸®ÇÏ¿© ±× ÁÖ¼Ò°¡ º¯ÇÒ °ÍÀÌ´Ù.
¾Æ¹«·± ´ë»ó¹°µµ ¼ºÀåÇÏÁö ¾Ê°í ÀÖ´Ù¸é,ÀÌ °ªÀº ´ç½ÅÀÌ ÇÒ´çÇÑ ´ÙÀ½¹øÀÇ ´ë»ó¹°ÀÌ ¾îµð¼ºÎÅÍ ½ÃÀÛ ÇÒ °ÍÀΰ¡¸¦ ¾Ë·ÁÁØ´Ù.(´Ù½Ã Çѹø »ý°¢Çغ¸¸é ±×°ÍÀº °ð ÇöÀçÀÇ µ¢¾î¸®ÀÌ´Ù.)
ÇÔ¼ö void * obstack__next__free (struct obstack *obstack_ptr)
ÀÌ ÇÔ¼ö´Â ±¸Á¶Ã¼ obstack_ptrÀÇ ÇöÀç µ¢¾î¸®¿¡¼ ÇØÁ¦µÈ ù ¹ÙÀÌÆ®ÀÇ ÁÖ¼Ò¸¦ ¹ÝȯÇÑ´Ù.À̰ÍÀº ÇöÀç ¼ºÀåÇϰí ÀÖ´Â ´ë»ó¹°ÀÇ ³¡ºÎºÐÀÌ´Ù.¸¸¾à ¾Æ¹«·± ´ë»ó¹°µµ ¼ºÀåÇϰí ÀÖÁö ¾Ê´Ù¸é, obstack_next_free ´Â obstack_base¿Í °°Àº °ªÀ» ¹ÝȯÇÑ´Ù.
ÇÔ¼ö size_t obstack__object__size (struct obstack *obstack_ptr)
ÀÌ ÇÔ¼ö´Â ÇöÀç ¼ºÀåÇϰí ÀÖ´Â ´ë»ó¹°ÀÇ ¹ÙÀÌÆ®¿¡¼ Å©±â¸¦ ¹ÝȯÇÑ´Ù. À̰ÍÀº obstack_next_free (obstack_ptr) ¿¡¼ obstack_base (obstack_ptr) ¸¦ »« °Í°ú °°´Ù.
<¹ø¿ªÀÚ ÁÖ¼®>
À§ÀÇ ³»¿ëµéÀ» Á¾ÇÕÇØ º¸¸é, °á±¹ ÀÌ·± ³»¿ëÀΰ¡?
--> ½ºÅÃ(stack)¿¡ ¸Þ¸ð¸®¸¦ È®º¸Çϰí Ãß°¡Çϰí ÇØÁ¦ÇÑ´Ù?
|
|
|
|
|||
|
|
|
|
|
½ÃÀÛÁöÁ¡: obstack__next__free | |
| ÇÔ¼öÀÇ ¹Ýȯ ÁÖ¼Ò. | |||||
|
|
|||||
|
|
|
|
|||
| ¼ºÀ广Çâ |
|
|
|||
|
|
|
Á¾·áÁöÁ¡:obstack_baseÇÔ¼öÀÇ ¹Ýȯ ÁÖ¼Ò. | |||
µû¶ó¼, À§ÀÇ ½ºÅÿ¡ ´ã±ä ´ë»ó¹°ÀÇ Å©±â´Â, "½ÃÀÛÁ¡(ÇØÁ¦ÁöÁ¡) - Á¾·áÁöÁ¡"ÀÌ µÇ´Â°Ç°¡? À½...,½º Åðú ±× ÁÖ¼Ò¸¦ Àß ÀÌÇØÇϰí ÀÖ´Â °í¼öµé¸¸ÀÌ Á¦´ë·Î ÀÌÇØÇÒ ¼ö ÀÖ°Ú±º...
(¾îÈÞ!..Ãʺ¸ÀÚÀÇ ¼³¿ò!..¸ÕÀú ½ºÅÃÀ» °øºÎÇÒ²¬²¬²¬!)
3.4.9 obstack¿¡¼ÀÇ µ¥ÀÌÅÍ ÇÒ´ç
°¢ obstackÀº ÇÒ´ç °æ°èÁöÁ¡À» °®´Â´Ù; obstack¿¡ ÀÚµ¿ÀûÀ¸·Î ÇÒ´çµÈ °¢ ´ë»ó¹°Àº ¼³Á¤µÈ °æ°èÁöÁ¡ ÀÇ ¹è¼ö·Î µÈ ÁÖ¼Ò·Î ½ÃÀÛÇÑ´Ù. µðÆúÆ® °ªÀ¸·Î ÀÌ °æ°èÁöÁ¡Àº 4 ¹ÙÀÌÆ®¼öÀÌ´Ù.
obstackÀÇ ÇÒ´ç °æ°èÁöÁ¡¿¡ Á¢±ÙÇϱâ À§Çؼ´Â ¸ÅÅ©·Î obstack_alignment_mask¸¦ »ç¿ëÇ϶ó. ÀÌ ÇÔ ¼öÀÇ ¿øÇüÀº ÀÌ·¸°Ô µÇ¾îÀÖ´Ù.
¸ÅÅ©·Î int obstack__alignment__mask (struct obstack *obstack_ptr)
±× °ªÀº ÇÑ ºñÆ®ÀÇ maskÀÌ´Ù; 1·Î µÈ ºñÆ®´Â ´ë»ó¹°ÀÇ ÁÖ¼Ò¿¡¼ ´ëÀÀÇÏ´Â ºñÆ®°¡ 0 À̾î¾ß ÇÔÀ» ³ª Ÿ³½´Ù. mask °ªÀº 2ÀÇ ¹è¼öº¸´Ù ÀÛÀº °ªÀ̾î¾ß ÇÑ´Ù; ±× °á°ú ¸ðµç ´ë»ó¹°ÀÇ ÁÖ¼Ò´Â 2ÀÇ ¹è¼öÀÇ ¹è ¼ö·Î µÈ´Ù. maskÀÇ µðÆúÆ® °ªÀÌ 3À¸·Î µÇ¸é ÁÖ¼ÒµéÀº 4ÀÇ ¹è¼ö·Î µÈ´Ù. maskÀÇ °ªÀÌ 0À¸·Î µÇ¸é,´ë »ó¹°ÀÌ 1ÀÇ ¹è¼ö·Î ½ÃÀÛÇÒ ¼ö ÀÖ´Ù.(Áï,ÇÒ´çÀÌ µÇÁö ¾Ê´Â´Ù.)
¸ÅÅ©·Î obstack_alignment_maskÀÇ È®ÀåÀº lvalueÀ̹ǷÎ,´ç½ÅÀº mask¸¦ º¯°æ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.¿¹¸¦ µé ¸é ´ÙÀ½°ú °°´Ù;
obstack_alignment_mask (obstack_ptr) = 0;
À§¿Í °°Àº ¹®ÀåÀº ¼³Á¤µÈ obstack¿¡¼ ÁøÇàÁßÀÎ ÇÒ´çÀ» ¾ø¾Ö¹ö¸®´Â È¿°ú¸¦ °®´Â´Ù.
ÇÒ´ç mask¿¡¼ ÀÏ¾î³ º¯È´Â ¾î¶² ´ë»ó¹°ÀÌ obstack¿¡¼ ÇÒ´çµÇ°Å³ª Á¾·áµÇ±â±îÁö´Â ¾Æ¹«·± È¿ °úµµ ¾ø´Ù. ¸¸¾à ´ç½ÅÀÌ ¾î¶² ´ë»ó¹°À» ¼ºÀå½Ã۰í ÀÖÁö ¾ÊÀ» °æ¿ì¶ó¸é,´ç½ÅÀº obstack_finish¸¦ È£Ãâ ÇÏ¿© »õ·Î¿î ÇÒ´ç mask°¡ Áï°¢ È¿°ú¸¦ °®µµ·Ï ÇÒ ¼ö ÀÖ´Ù.À̰ÍÀº ±æÀ̰¡ Á¦·ÎÀÎ ´ë»ó¹°À» Á¾·áÇÏ°í ´ÙÀ½ ´ë»ó¹°À» À§ÇÑ ÀûÀýÇÑ ÇÒ´çÀ» ÇÏ´Â °ÍÀÌ´Ù.
3.4.10 obstack µ¢¾î¸®
obstackÀº ÀÚüÀÇ ±â´ÉÀ¸·Î Å« µ¢¾î¸®¿¡ °ø°£À» ÇÒ´çÇÏ°í ´ç½ÅÀÇ ¿äû¿¡ ºÎÀÀÇÏ¿© µ¢¾î¸®¿¡¼ °ø °£À» ºÐ¹èÇÑ´Ù.µ¢¾î¸®µéÀº ´ç½ÅÀÌ º°µµÀÇ Å©±â¸¦ ÁöÁ¤ÇÏÁö ¾Ê´Â ÀÌ»ó 4096 ¹ÙÀÌÆ®ÀÇ Å©±âÀÌ´Ù. µ¢ ¾î¸® Å©±â´Â ´ë»ó¹°µéÀ» ÀúÀåÇϴµ¥¿¡ ½ÇÁ¦·Î »ç¿ëµÇÁö ¾Ê´Â 8 ¹ÙÀÌÆ®ÀÇ ºÎ°¡¹°À» Æ÷ÇÔÇÑ´Ù. ¼³Á¤ µÈ Å©±â¿¡ °ü°è¾øÀÌ, Å« ´ë»ó¹°À» À§Çؼ ÇÊ¿äÇÏ´Ù¸é ´õ Å« µ¢¾î¸®µéÀÌ ÇÒ´çµÇ¾îÁú °ÍÀÌ´Ù.
obstack ¶óÀ̺귯¸®´Â ÇÔ¼ö obstack_chunk_allocÀ» È£ÃâÇÏ¿© µ¢¾î¸®µéÀ» ÇÒ´çÇϴµ¥,´ç½ÅÀÌ ±×°ÍÀ» Á¤ÀÇÇÏ¿©¾ß ÇÑ´Ù.´ç½ÅÀÌ ¾î¶² µ¢¾î¸®¿¡ ÀÖ´Â ´ë»ó¹°À» ÇØÁ¦ÇÑ °á°ú·Î¼ ¾î¶² µ¢¾î¸®°¡ ´õÀÌ»ó ÇÊ ¿äÄ¡ ¾Ê°Ô µÇ¸é, obstack ¶óÀ̺귯¸®´Â ÇÔ¼ö obstack_chunk_free¸¦ È£ÃâÇÏ¿© ±× µ¢¾î¸®¸¦ ÇØÁ¦ÇÑ´Ù.
¹°·Ð ´ç½ÅÀº ±×°Í ¶ÇÇÑ Á¤ÀÇÇÏ¿©¾ß ÇÑ´Ù. ÀÌµé µÑÀº obstack_init(3.4.1 [obstack ¸¸µé±â],28ÂÊ ÂüÁ¶) ¸¦ »ç¿ëÇÏ´Â °¢ ¼Ò½ºÆÄÀÏ¿¡¼ (¸ÅÅ©·Î·Î)Á¤Àǵǰųª (ÇÔ¼ö·Î)¼±¾ðµÇ¾î¾ß¸¸ ÇÑ´Ù.±×°ÍµéÀº °ÅÀÇ ´ëºÎ ºÐ ¾Æ·¡¿Í °°ÀÌ ¸ÅÅ©·Î·Î Á¤ÀǵȴÙ:
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free
À̵éÀº (Àμö°¡ ¾Æ´Ï¶ó) ´Ü¼øÈ÷ ¸ÅÅ©·ÎÀÓÀ» ÁÖÀÇÇ϶ó. Àμö¸¦ °®´Â ¸ÅÅ©·Î Á¤ÀÇ´Â À¯È¿Ä¡ ¾Ê´Ù! ´Ù¸¸
obstack_chunk_alloc ³ª obstack_chunk_free´Â ±× ÀÚü°¡ ÇÔ¼ö¸íĪÀÌ ¾Æ´Ò °æ¿ì¿¡ ÇÔ¼ö ¸íĪÀ¸·Î È® ÀåµÉ Çʿ䰡 ÀÖ´Ù.
½ÇÁ¦·Î obstack_chunk_allocÀ» »ç¿ëÇÏ´Â ÇÔ¼ö´Â ¾î¶² ÇüÅ·εç "½ÇÆÐ"¸¦ ¹ÝȯÇÒ ¼ö ¾ø´Ù. ¿Ö³ÄÇϸé obstack ¶óÀ̺귯¸®´Â ½ÇÆÐ¸¦ Ãë±ÞÇÒ Áغñ°¡ µÇ¾îÀÖÁö ¾Ê±â ¶§¹®ÀÌ´Ù.±×·¯¹Ç·Î malloc ±× ÀÚü´Â Àû ÇÕÇÏÁö°¡ ¾Ê´Ù.¸¸¾à ±× ÇÔ¼ö°¡ °ø°£À» È®º¸ÇÏÁö ¸øÇÏ°Ô µÇ¸é, ±×°ÍÀº 󸮸¦ Á¾·áÇϰųª(22.3 [ÇÁ·Î±× ·¥ Á¾·á],320ÂÊ ÂüÁ¶.) longjmp¸¦ »ç¿ëÇÏ´Â ºñÁö¿ªÀû Á¾·á¸¦ ÇàÇÏ°Ô µÈ´Ù.(20Àå [ºñÁö¿ªÀû Á¾·á],267ÂÊ ÂüÁ¶)
¸¸¾à ´ç½ÅÀÌ mallocÀ» ½á¼ µ¢¾î¸®µéÀ» ÇÒ´çÇÑ´Ù¸é, µ¢¾î¸® Å©±â´Â 2ÀÇ ¹è¼ö¿©¾ß¸¸ ÇÑ´Ù.µ¢¾î¸®ÀÇ µðÆúÆ® Å©±â´Â 4096À¸·Î ¼±ÅõǾî ÀÖ´Ù.¿Ö³ÄÇÏ¸é µðÆúÆ® Å©±â¸¸À¸·Îµµ ÇöÀç·Î¼´Â ÀÛÀº ´ë»ó¹°¿¡¼ ¿ä±¸µÇ¾îÁú ´ëºÎºÐÀÇ ÀüÇüÀûÀÎ ¿äûµéÀ» ¸¸Á·½Ãų ¼ö°¡ ÀÖÀ¸¸ç, ¾ÆÁ÷Àº ±× ´ë»ó¹°ÀÇ Å©±â°¡ »ç¿ëµÇ Áö ¾ÊÀº °¡Àå ÃÖ±ÙÀÇ µ¢¾î¸® ºÎºÐ¿¡ ³Ê¹« ¸¹Àº ¸Þ¸ð¸®°¡ ³¶ºñµÇÁö ¾Ê°Ô ÇØµµ µÉ¸¸Å À۱⠶§¹®ÀÌ ´Ù.
¸ÅÅ©·Î size_t obstack__chunk__size (struct obstack *obstack_ptr)
À̰ÍÀº ÁÖ¾îÁø obstackÀÇ µ¢¾î¸® Å©±â¸¦ ¹ÝȯÇÑ´Ù.
ÀÌ ¸ÅÅ©·Î´Â lvalue·Î È®ÀåµÇ¹Ç·Î, ´ç½ÅÀº ±×°Í¿¡ »õ·Î¿î °ªÀ» ÇÒ´çÇÔÀ¸·Î½á »õ·Î¿î µ¢¾î¸® Å©±â¸¦ ±ÔÁ¤ÇÒ ¼ö ÀÖ´Ù. ±×·¸°Ô ÇÏ°Ô µÇ¸é ÀÌ¹Ì ÇÒ´çµÇ¾îÀÖ´Â µ¢¾î¸®¿¡´Â ¿µÇâÀÌ ¾ø°í, ´Ù¸¸ Àå·¡¿¡ ƯÁ¤ÇÑ obstackÀ» À§ÇÏ¿© ÇÒ´çµÉ µ¢¾î¸®µéÀÇ Å©±â¿¡¸¸ ¿µÇâÀ» ÁÖ°Ô µÈ´Ù.±×°ÍÀº µ¢¾î¸® Å©±â¸¦ ÀÛ°Ô ¸¸µå´Â
µ¥¿¡´Â ¼Ò¿ëÀÌ ¾ø´Ù. ¸¸¾à ´ç½ÅÀÌ ±× Å©±â°¡ µ¢¾î¸® Å©±â¿Í ºñ½ÁÇÑ ¸¹Àº ´ë»ó¹°À» ÇÒ´çÇÏ°í ½Í´Ù¸é µ¢¾î¸® Å©±â¸¦ Å©°Ô ¸¸µå´Â °ÍÀÌ ¸Å¿ì È¿°úÀûÀÏ °ÍÀÌ´Ù.
3.4.11 obstack ÇÔ¼ö ¿ä¾à
obstack°ú °ü·ÃµÈ ÇÔ¼öµéÀ» ¿ä¾àÇØº¸ÀÚ. °¢ ÇÔ¼öµéÀº ù Àμö·Î¼ obstack(±¸Á¶Ã¼ Æ÷ÀÎÅͷμ)ÀÇ ÁÖ ¼Ò¸¦ °®´Â´Ù.
void obstack_init (struct obstack *obstack_ptr)
obstackÀÇ »ç¿ëÀ» ÃʱâÈÇÑ´Ù. 3.4.1 [obstack ¸¸µé±â],28ÂÊ ÂüÁ¶.
void *obstack_alloc (struct obstack *obstack_ptr, size_t size)
ÃʱâȵÇÁö ¾ÊÀº ¹ÙÀÌÆ® Å©±âÀÇ ´ë»ó¹°À» ÇÒ´çÇÑ´Ù. 3.4.3 [obstack ÇÒ´ç0,29ÂÊ ÂüÁ¶.
void *obstack_copy (struct obstack *obstack_ptr, void *address, size_t size)
size ¹ÙÀÌÆ® Å©±âÀÇ ´ë»ó¹°À» ÇÒ´çÇϰí ÁÖ¼Ò¿¡¼ º¹»çÇÑ ³»¿ëÀ» ä¿î´Ù. 3.4.3 [obstack ÇÒ´ç],29ÂÊ Âü Á¶.
void *obstack_copy0 (struct obstack *obstack_ptr, void *address, size_t size)
size+1 ¹ÙÀÌÆ® Å©±âÀÇ ´ë»ó¹°À» ÇÒ´çÇϰí ÁÖ¼Ò¿¡¼ º¹»çÇÑ ±×¸¸ÇÑ Å©±âÀÇ ³»¿ëÀ» ä¿ì°í ³¡¿¡ ³Î (null) ¹®ÀÚ¸¦ ºÙÀδÙ. 3.4.3 [obstack¿¡¼ÀÇ ÇÒ´ç],29ÂÊ ÂüÁ¶.
void obstack_free (struct obstack *obstack_ptr, void *object)
´ë»ó¹° ÇØÁ¦(µ¿½Ã¿¡ ´ë»ó¹°º¸´Ù ´õ ÃÖ±Ù¿¡ ¼³Á¤µÈ obstack¿¡ ÇÒ´çµÈ ¸ðµç °ÍÀ» ÇØÁ¦) 3.4.4 [obstack ´ë»ó¹° ÇØÁ¦Çϱâ],30ÂÊ ÂüÁ¶.
void obstack_blank (struct obstack *obstack_ptr, size_t size)
¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ ÃʱâȵÇÁö ¾ÊÀº size ¹ÙÀÌÆ®¸¦ Ãß°¡. 3.4.6 [¼ºÀåÇÏ´Â ´ë»ó¹°],31ÂÊ ÂüÁ¶.
void obstack_grow (struct obstack *obstack_ptr, void *address, size_t size)
size ¹ÙÀÌÆ®¸¦ ÁּҷκÎÅÍ º¹»çÇÏ¿© ¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ Ãß°¡. 3.4.6 [¼ºÀåÇÏ´Â ´ë»ó¹°],31ÂÊ ÂüÁ¶.
void obstack_grow0 (struct obstack *obstack_ptr, void *address, size_t size)
size ¹ÙÀÌÆ®¸¦ ÁּҷκÎÅÍ º¹»çÇÏ¿© ¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ Ãß°¡ÇÏ°í ³Î(null) ¹®ÀÚ¸¦ ´ã°íÀÖ´Â ´Ù¸¥ ¹Ù ÀÌÆ®¸¦ µ¡ºÙÀδÙ. 3.4.6 [¼ºÀåÇÏ´Â ´ë»ó¹°],31ÂÊ ÂüÁ¶.
void obstack_1grow (struct obstack *obstack_ptr, char data_char)
¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ data_char¸¦ ´ã°íÀÖ´Â ÇÑ ¹ÙÀÌÆ®¸¦ Ãß°¡. 3.4.6 [ ¼ºÀåÇÏ´Â ´ë»ó¹°],31ÂÊ ÂüÁ¶.
void *obstack_finish (struct obstack *obstack_ptr)
¼ºÀåÇϰí ÀÖ´Â ´ë»ó¹°À» Á¾°áÇÏ°í ±×°ÍÀÇ ÃÖÈÄ ÁÖ¼Ò¸¦ ¹Ýȯ. 3.4.6 [¼ºÀåÇÏ´Â ´ë»ó¹°],31ÂÊ ÂüÁ¶.
size_t obstack_object_size (struct obstack *obstack_ptr)
ÇöÀç ¼ºÀåÇϰíÀÖ´Â ´ë»ó¹°ÀÇ ÇöÀçÀÇ Å©±â¸¦ ±¸ÇÑ´Ù. 3.4.6 [¼ºÀåÇÏ´Â ´ë»ó¹°],31ÂÊ ÂüÁ¶.
void obstack_blank_fast (struct obstack *obstack_ptr, size_t size)
ÃæºÐÇÑ °ø°£ÀÌ ÀÖ´ÂÁöÀÇ ¿©ºÎ¸¦ üũÇÏÁö ¾Ê°í¼,¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ ÃʱâȵÇÁö ¾ÊÀº size ¹ÙÀÌÆ®¸¦ Ãß°¡. 3.4.7 [±Þ¼ÓÇÑ ¼ºÀåÇÔ¼ö],32ÂÊ ÂüÁ¶.
void obstack_1grow_fast (struct obstack *obstack_ptr, char data_char)
ÃæºÐÇÑ °ø°£ÀÌ ÀÖ´ÂÁöÀÇ ¿©ºÎ¸¦ üũÇÏÁö ¾Ê°í¼,¼ºÀåÇÏ´Â ´ë»ó¹°¿¡ data_char¸¦ ´ãÀ» ÇÑ ¹ÙÀÌÆ®¸¦ Ãß°¡. 3.4.7 [±Þ¼ÓÇÑ ¼ºÀåÇÔ¼ö],32ÂÊ ÂüÁ¶.
size_t obstack_room (struct obstack *obstack_ptr)
ÇöÀçÀÇ ´ë»ó¹°À» ¼ºÀå½ÃŰ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Â °ø°£ÀÇ ¾çÀ» È®º¸. 3.4.7 [[±Þ¼ÓÇÑ ¼ºÀåÇÔ¼ö],32ÂÊ Âü Á¶.
int obstack_alignment_mask (struct obstack *obstack_ptr)
´ë»ó¹°ÀÇ ½ÃÀÛÁ¡À» Á¤µ·Çϱâ À§ÇØ »ç¿ëµÇ´Â mask. À̰ÍÀº lvalueÀÌ´Ù. 3.4.9 [obstack¿¡¼ÀÇ µ¥ÀÌÅÍ ÇÒ´ç],34ÂÊ ÂüÁ¶.
size_t obstack_chunk_size (struct obstack *obstack_ptr)
µ¢¾î¸® ÇÒ´çÀ» À§ÇÑ Å©±â. À̰ÍÀº lvalueÀÌ´Ù. 3.4.10 [obstack µ¢¾î¸®],34ÂÊ ÂüÁ¶.
void *obstack_base (struct obstack *obstack_ptr)
ÇöÀç ¼ºÀåÇÏ´Â ´ë»ó¹°ÀÇ Àӽà ½ÃÀÛÁÖ¼Ò. 3.4.8 [obstackÀÇ À§»ó],33ÂÊ ÂüÁ¶.
void *obstack_next_free (struct obstack *obstack_ptr)
ÇöÀçÀÇ ¼ºÀåÇÏ´Â ´ë»ó¹°ÀÌ ³¡³ª´Â ¹Ù·Î ´ÙÀ½ÀÇ ÁÖ¼Ò. 3.4.8 [obstackÀÇ À§»ó],33ÂÊ ÂüÁ¶.
3.5 ´Ù¾çÇÑ Å©±â·ÎÀÇ ÀÚµ¿ÀúÀå
ºÒÃæºÐÇÑ µ¿ÀûÇÒ´çÀ» Áö¿øÇÏ´Â ÇÔ¼öµéÁßÀÇ ÇϳªÀÎ alloca´Â µ¿ÀûÀ¸·Î ÇÒ´çÀ» ÇÏÁö¸¸ ÀÚµ¿ÀûÀ¸·Î ÇØ Á¦µÇÁö´Â ¾Ê´Â´Ù. alloca¸¦ °¡Áö°í ºí·ÏÀ» ÇÒ´çÇÏ´Â °ÍÀº ¸í¹éÇÑ µ¿ÀÛÀÌ´Ù; ´ç½ÅÀº ¿øÇÏ´Â ¸¸ÅÀÇ ¸¹ Àº ºí·ÏÀ» ÇÒ´çÇÒ¼ö ÀÖ°í ½ÇÇà½Ã¿¡ ±× Å©±â¸¦ °è»êÇÒ¼öµµ ÀÖ´Ù. alloca·Î ÇÒ´çµÈ °ø°£ÀÇ º¯¼ö°¡ ´ÜÁö ±× ÇÔ¼ö ¾È¿¡¼ ÀÚµ¿º¯¼ö¶ó°í¸¸ ¼±¾ðÀÌ µÇ¾ú´Ù¸é ±×·¸°Ô ÇÒ´çµÈ ºí·ÏµéÀº ÇÔ¼ö¸¦ ºüÁ®³ª°¥ ¶§ ¸ðµÎ ÇØÁ¦µÈ´Ù. ÇÏÁö¸¸ ´Ù¸¥°æ¿ì´Â ¸í¹éÇÏ°Ô ±× °ø°£À» ÇØÁ¦ÇÏ´Â ¹æ¹ýÀÌ ¾ø´Ù.
allocaÀÇ ÇÁ·ÎÅäŸÀÔÀº 'stdlib.h'ÀÌ´Ù. ÀÌ ÇÔ¼ö´Â BSDÈ®ÀåÀÌ´Ù.
ÇÔ¼ö void * alloca (size_t size);
alloca´Â ºÒ¸®¿öÁø ÇÔ¼öÀÇ ½ºÅÃÇÁ·¹ÀӾȿ¡ ¸î¹ÙÀÌÆ®ÀÇ Å©±â¸¦ °¡Áø ºí·ÏÀ» ÇÒ´çÇÏ°í ±× ºí·ÏÀÇ ÁÖ¼Ò °ªÀ» ¸®ÅÏÇÑ´Ù. ¿¹ÃøÇÒ¼ö ¾ø´Â °á°ú¸¦ ¾òÀ»Áöµµ ¸ð¸£´Â ÇÔ¼öµéÀÇ Àμö³»ºÎ¿¡ alloca¸¦ »ç¿ëÇÏÁö ¸» ¶ó. ¿Ö³ÄÇϸé alloca¸¦ À§ÇÑ ½ºÅÃÀÇ °ø°£Àº ÇÔ¼öÀμöµéÀ» À§ÇÑ ±× °ø°£ÀÇ Áß°£¿¡ ¸¸µé¾îÁö±â ¶§¹®ÀÌ ´Ù. ÇÇÇØ¾ßÇÒ ¿¹´Â foo (x, alloca(4), y)ÀÌ´Ù.
3.5.1 alloca ¿¹
allocaÀÇ »ç¿ë¿¹·Î¼ ¿©±â¿¡ ÇÑ ÇÔ¼ö°¡ ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â Àμö·Î ¹ÞÀº µÎ °³ÀÇ ¹®ÀÚ¿À» ºÙ¿©¼ ¸¸ µç °ÍÀ» ÆÄÀÏÀ̸§À¸·Î ÇØ¼ ±× ÆÄÀÏÀ» ¿°í ±×°ÍÀ» ÆÄÀϱâ¼úÀÚ¿¡ Àü´ÞÇϰųª ½ÇÆÐÇÑ °æ¿ì´Â -1À» ¸®ÅÏÇÏ´Â ÇÔ¼öÀÌ´Ù.
/* ¿ª½Ã Á¦°¡ ÁÖ¼®À» Á»..ÁÖ¼®ÀÌ Æ²·ÈÀ¸¸é Àú¿¡°Ô ¿Õâ ¿åÇØÁּſä... */
int open2 (char *str1, char *str2, int flags, int mode)
{
/* alloca¸¦ °¡Áö°í µÎ °³ÀÇ ¹®ÀÚ¿ ±æÀÌ¿¡ °¢°¢ 1À» ´õÇÑ ±æÀ̸¸ÅÀÇ °ø°£À» charÇüÀ¸·Î ÇÒ´ç¹Þ°í ±× Æ÷ÀÎÅ͸¦ name¿¡°Ô ÁÖ¾ú¾î¿ä.*/
char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
/* strcpy´Â ¹®ÀÚ¿À» º¹»çÇϰí strcat´Â ¹®ÀÚ¿À» µ¡ºÙÀÌ´Â ÇÔ¼ö */
strcpy (name, str1);
strcat (name, str2);
/* º¹»çÇÏ°í µ¡ºÙ¿©¼ ¸¸µç nameÀ» ÆÄÀÏÀ̸§À¸·Î ÇØ¼ ÆÄÀÏÇϳª¸¦ ¿°í ±×°ÍÀ» ¸®ÅÏÇϳ׿ä.. */
return open (name, flags, mode);
}
ÀÌ°Ç mallocÀ» »ç¿ëÇØ¼ ¾î¶»°Ô °°Àº °á°ú¸¦ ¾ò°í ÇØÁ¦ÇÏ´ÂÁö¿¡ ´ëÇÑ ¿¹.
int open2 (char *str1, char *str2, int flags, int mode)
{
/* ¸»ÇßµíÀÌ mallocÀ» ÀÌ¿ëÇØ¼ ÇÊ¿äÇÑ °ø°£À» ÇÒ´çÇϳ׿ä..*/
char *name = (char *) malloc (strlen (str1) + strlen (str2) + 1);
int desc;
/* ¸¸¾à °ø°£ÀÌ ÇÒ´çµÇÁö ¾Ê¾ÒÀ¸¸é ¿¡·¯Ã³¸® */
if (name == 0)
fatal ("virtual memory exceeded");
strcpy (name, str1);
strcat (name, str2);
/* ÀϽÃÀûÀ¸·Î ÆÄÀÏ ÇÚµéÀ» desc¿¡ ÀúÀå */
desc = open (name, flags, mode);
free (name);
return desc;
}
À§¿¡¼ º»°Íó·³ alloca¸¦ ÀÌ¿ëÇÏ¸é ´õ °£´ÜÇÏ°Ô ±¸ÇöÇÒ¼ö ÀÖ°ÚÁö¸¸ alloca¸¦ »ç¿ëÇÏ´Â °ÍÀº ¸¹Àº À̵æÀÌ ÀÖ´Â ´ë½Å¿¡ ¸î°¡Áö ¼ÕÇØµµ ¾òÀ»¼ö ÀÖ´Ù´Â°É ¸í½ÉÇ϶ó.
3.5.2 alloca¸¦ ÀÌ¿ëÇØ¼ ¾ò´Â À̵æ
¿©±â¿¡ mallocº¸´Ù´Â alloca¸¦ ¼±ÅÃÇÏ°Ô µÇ´Â ÀÌÀ¯°¡ ÀÖ´Ù.
alloca¸¦ »ç¿ëÇÏ¸é ¸Å¿ì ÀûÀº °ø°£À» ¼ÒºñÇÏ°í ¸Å¿ì ºü¸£´Ù. ( ±×°ÍÀº alloca°¡ GNU C ÄÄÆÄÀÏ·¯ »ó ¿¡¼ open-coded À̾î¼..) alloca´Â ºí·ÏÀ» ¿©·¯Å©±â·Î ³ª´©Áö ¾Ê°í ÀÌ¹Ì ÀÖ´Â ´Ù¸¥ Å©±âÀÇ ºí·ÏÀ» Àç »ç¿ëÇÒ¼ö Àֱ⠶§¹®¿¡ ¸Þ¸ð¸® ´ÜÆíÈÀÇ ¿øÀÎÀÌ µÇÁö ¾Ê´Â´Ù. È£ÃâµÈ alloca¸¦ ÅëÇØ ¸¸µé¾îÁø ÇÒ´ç µÈ °ø°£Àº longjmp( 20Àå [Non-Local Exits]¸¦ º¸¶ó. )·Î ÀÚµ¿ÀûÀ¸·Î ÇØÁ¦ÇÒ¼ö ÀÖ´Â NonlocalÀÌ ÀÖ ´Ù.
Âü°í·Î NonlocalÀÇ Àǹ̸¦ Àß ¸ð¸£°Ú¾î¼ Ã¥µéÀ» µÚÁ® º¸´Ï±î ÀÌ·±°Ô ³ª¿Í Àֳ׿ä.
nonlocal: ±¸Á¶ÈµÈ ÇÁ·Î±×·¡¹Ö ¾ð¾î¸¦ »ç¿ëÇÏ¿© ÀÛ¼ºµÈ ÇÁ·Î±×·¥ÀÇ ¾î¶² ºí·Ï¿¡¼ Àڱ⠺í·Ï¿¡ Á¤ÀǵǾî ÀÖÁö ¾ÊÀº º¯¼ö¸¦ ÂüÁ¶ÇÏ´Â °ÍÀ̶󱸿ä... ÇÏÁö¸¸ ¿©±âÀÇ NonlocalÀ» ÀǹÌÇÏ´ÂÁö´Â Àß ¸ð ¸£°Ú¾î¿ä.Á¦ »ý°¢¿¡´Â ¾óÃß ºñ½ÁÇÒ °Í °°Àºµ¥..
À̰ÍÀ» ±¸ÇöÇϱâ À§Çؼ, È£Ãâ¿¡ ¼º°øÇϸé openÇÔ¼öó·³ ÇÑ µð½ºÅ©¸³Å͸¦ ¸®ÅÏÇÏ°í ½ÇÆÐÇÏ¸é ¾Æ¹« °Íµµ ¸®ÅÏÇÏÁö ¾Ê´Â opne_or_report_error À̶ó´Â ÇÔ¼ö°¡ ÀÖ´Ù°í °¡Á¤Ç϶ó. ¸¸¾à È£Ãâ¿¡ ½ÇÆÐÇØ¼ ÆÄ ÀÏÀÌ ¿·ÁÁöÁö ¾ÊÀ¸¸é, ¿¡·¯ ¸Þ½ÃÁö¸¦ ÇÁ¸°Æ®Çϰí longjmp¸¦ »ç¿ëÇØ¼ ´ç½ÅÀÇ ÇÁ·Î±×·¥ÀÇ ÇÑ ·¹º§À» ºüÁ®³ª¿Â´Ù. À̰ÍÀ» »ç¿ëÇØ¼ open2¸¦ ¹Ù²Ù¾îº¸ÀÚ.
subroutine:
¼ºê·çƾ:
int open2 (char *str1, char *str2, int flags, int mode)
{
char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
strcpy (name, str1);
strcat (name, str2);
/* ¾Æ±î open2 ÇÔ¼ö¿¡¼ º¯ÈµÈ °ÍÀº openÇÔ¼ö°¡ open_or_report_error·Î ´ëÄ¡µÈ°Å³×¿ä. */
return open_or_report_error (name, flags, mode);
}
/* Á»´õ ÀÚ¼¼È÷ Á¦°¡ ÀÌÇØÇÑ´ë·Î º¸Ãæ¼³¸íÀ» µå¸®ÀÚ¸é... ½ÇÁ¦·Î open_or_report_error À̶ó´Â ÇÔ¼ö°¡ Á¸ÀçÇÏÁö ¾Ê´Âµ¥ ±×³É ÀÖ´Ù°í °¡Á¤ÇÏ°í ¾²¸é ÇÁ·Î±×·¥³»¿¡¼ ±×°ÍÀ» È£ÃâÇÒ¼ö ¾øÀ¸¹Ç·Î ¿¡·¯°¡ ³ª °ÚÁö¿ä. ±×·±µ¥ ±× alloca¶õ ³ðÀÌ ÀÏ´Ü ¿¡·¯°¡ ³ª¸é alloca¸¦ ÅëÇØ ÇÒ´çµÈ ¸ðµç °ø°£À» ÇØÁ¦ÇÏ°í ºü Á®³ª¿Ã¼ö Àֱ⠶§¹®¿¡, ±×¸®°í alloca´Â ¸í¹éÇÏ°Ô °ø°£Àº ÇØÁ¦ÇØÁÖ´Â ±â´ÉÀÌ ¾øÀ¸´Ï±î.. ÀÌ·± Æí¹ýÀ» »ç¿ëÇÏ°Ô µÇ³ªºÁ¿ä. ÀÌ°Ç ±×³É Á¦°¡ ÀÌÇØÇѰű¸¿ä.. ¸¸¾à Ʋ¸®¸é Ʋ·È°í ±×°Ô ¾Æ´Ï¶õ°É °Ô½ÃÆÇ¿¡ ¿Ã·ÁÁÖ¼¼¿ä.*/
alloca¸¦ ÅëÇÑ ÀÛ¾÷¿¡¼ ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏ´Â ÀÌÀ¯´Â alloca¸¦ ÅëÇØ ÇÒ´çµÈ °ø°£Àº ¿¡·¯°¡ ¹ß»ýÇÏ¸é ¾î¶² Ưº°ÇÑ ³ë·Â¾øÀÌ ÇÒ´çµÈ °ø°£À» ÇØÁ¦ÇÒ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¾ÕÀÇ open2¿Í ºñ±³Çؼ( malloc°ú free¸¦ »ç¿ëÇÏ´Â ) ÀÌ ¹æ¹ýÀ» »ç¿ëÇϸé ÀúÀå°ø°£ÀÇ À¯ÃâÀ» ¹ß°ßÇÒ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª ´ç½ÅÀÌ Á» ´õ ¸¹Àº º¯È¸¦ ¿øÇÑ´Ù¸é ±×·¸°Ô ÇÏ´Â ½¬¿î ¹æ¹ýÀº ¾Æ¹«°Íµµ ¾ø´Ù.
3.5.3 allocaÀÇ ´ÜÁ¡
À̰÷Àº malloc°ú ºñ±³ÇÏ¿© allocaÀÇ ´ÜÁ¡À» º¸¿©ÁØ´Ù.
¸¸¾à ´ç½ÅÀÌ alloca¸¦ °¡Áö°í ½Ã½ºÅÛÀÌ Á¦°øÇÒ¼ö Àִ°ͺ¸´Ù ´õ ¸¹Àº ÀúÀå°ø°£À» ÇÒ´ç¹Þ±æ ¿øÇÏ¸é ´ç½ÅÀº ¸í¹éÇÑ ¿¡·¯ ¸Þ½ÃÁö¸¦ ¾òÀ»¼ö ¾ø´Ù. ´ë½Å¿¡ ´ç½ÅÀº ¹«ÇÑ Àç±ÍÈ£Ãâ¿¡¼ ¾òÀ»¼ö ÀÖ´Â °Í°ú °° Àº ½É°¢ÇÑ ½ÅÈ£¸¦ ¾òÀ» °Í ÀÌ´Ù.; ¾Æ¸¶µµ segmentation À§¹è ( 21.2.1Àý[ ÇÁ·Î±×·¥ ¿¡·¯ ½ÅÈ£]ÆäÀÌÁö 273À» ÂüÁ¶) ¾î¶² ºñGNU ½Ã½ºÅÛµéÀº ÀÌ alloca¸¦ Áö¿øÇÏÁö ¾Ê¾Æ¼ À̽ļºÀÇ Ãø¸é¿¡¼´Â Á» ¶³¾îÁø ´Ù. ±×·¸Áö¸¸ alloca´Â ÀÌ·± °áÁ¡¿¡µµ ºÒ±¸Çϰí À¯¿ëÇÏ°Ô »ç¿ëµÈ´Ù.
3.5.4 GNU C º¯ÇÒ¼ö ÀÖ´Â Å©±âÀÇ ¹è¿
GNU C¿¡¼ ´ç½ÅÀº allocaÀÇ »ç¿ëÀ» º¯È°¡´ÉÇÑ Å©±â¸¦ °®´Â ¹è¿À»(an array of variable size) »ç ¿ëÇØ¼ ´ëüÇÒ¼ö ÀÖ´Ù. ¿©±â¿¡ ±×°ÍÀ» º¸¿©ÁÖ´Â ¿¹°¡ ÀÖ´Ù.
int open2 (char *str1, char *str2, int flags, int mode)
{
/* À§¿¡¼ alloca¸¦ »ç¿ëÇØ¼ ÇÒ´çÇß´ø °ø°£À» ´ë½Å Å©±â°¡ 'str1ÀÇ ¹®ÀÚ±æÀÌ + str2ÀÇ ¹®ÀÚ±æÀÌ + 1'ÀÎ ¹è¿À» ¸¸µé¾ú³×¿ä.*/
char name[strlen (str1) + strlen (str2) + 1];
strcpy (name, str1);
strcat (name, str2);
return open (name, flags, mode);
}
±×·¯³ª alloca´Â ¿©·¯ °¡Áö ÀÌÀ¯·Î º¯È°¡´ÉÇÑ Å©±â¸¦ °®´Â ¹è¿·Î Ç×»ó ´ëüÇÒ¼ö ÀÖ´Â °ÍÀº ¾Æ´Ï ´Ù. º¯È°¡´ÉÇÑ ¹è¿¿¡°Ô ÇÒ´çµÈ ¸Þ¸ð¸® °ø°£Àº ¹è¿ÀÌ ¼±¾ðµÈ ¿µ¿ªÀÇ ³¡¿¡¼ ÇØÁ¦µÇÁö¸¸ alloca·Î ÇÒ´çµÈ °ø°£Àº ÇÔ¼ö°¡ ³¡³¯ ¶§ ±îÁö ³²¾ÆÀִ´Ù.
¹Ýº¹À» »ç¿ëÇßÀ» ¶§ °¢ ¹Ýº¹¸¶´Ù ´õÇØ¼ ºí·ÏÀ» ÇÒ´çÇÏ´Â loop¿¡¼ alloca¸¦ »ç¿ëÇÏ´Â °ÍÀº °¡´ÉÇÏ ´Ù. ÇÏÁö¸¸ º¯È°¡´ÉÇÑ Å©±â¸¦ °®´Â ¹è¿·Î´Â ºÒ°¡´ÉÇÏ´Ù.
ÁÖÀÇ : ¸¸¾à ´ç½Ådl alloca¿Í º¯È°¡´ÉÇÑ Å©±â¸¦ °®´Â ¹è¿À» ÇÑ ÇÔ¼ö ¾È¿¡¼ È¥¿ëÇϸé, º¯È°¡´ÉÇÑ Å©±â¸¦ °®´Â ¹è¿ÀÌ ¼±¾ðµÈ ¿µ¿ªÀ» ¹þ¾î³¯ ¶§ ±× ¿µ¿ªÀÌ ½ÇÇàµÇ´Â µ¿¾È¿¡ alloca·Î ÇÒ´çÇß´ø ¸ðµç ºí·Ïµéµµ ÇØÁ¦µÈ´Ù´Â °ÍÀ» ¸í½ÉÇ϶ó.
3.6 ÀçÁ¶Á¤ ÇÒ´çÀÚ
¾î¶°ÇÑ Ã¼Á¦ÀÇ µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ̵簣¿¡ ºÎ°¡¹°À» °®´Â´Ù: ±×°ÍÀÌ »ç¿ëÇÏ´Â °ø°£ÀÇ ¾çÀº ÇÁ·Î±×·¥ ÀÌ ¿ä±¸ÇÏ´Â °ø°£ÀÇ ¾çº¸´Ù Å©´Ù.¸Þ¸ð¸® ÀçÁ¶Á¤ ÇÒ´çÀÚ´Â µ¶ÀÚÀû ÆÇ´ÜÀ¸·Î ÇÊ¿äÇÑ ¸¸ÅÀÇ ¸Þ¸ð¸® ºí ·°À» À̵¿½ÃÅ´À¸·Î½á ºÎ°¡¹°À» ÃÖ¼ÒÈÇÑ´Ù.
3.6.1 ÀçÁ¶Á¤ ÇÒ´çÀÚÀÇ °³³ä
´ç½ÅÀÌ mallocÀ» ½á¼ ÇÑ ºí·°À» ÇÒ´çÇÏ°í³ª¸é,´ç½ÅÀÌ ±× Å©±â¸¦ º¯°æÇÒ ¸ñÀûÀ¸·Î reallocÀ» »ç¿ëÇÏ Áö ¾Ê´Â ÀÌ»ó ±× ºí·°ÀÇ ÁÖ¼Ò´Â °áÄÚ º¯ÇÏÁö ¾Ê´Â´Ù.±×·¯¹Ç·Î,´ç½ÅÀº ´ç½ÅÀÌ ¿øÇϴ´ë·Î ´Ù¾çÇÑ °ø°£ ¿¡¼ ±× ÁÖ¼Ò¸¦ ÀϽÃÀûÀ¸·Î ¶Ç´Â ¿µ±¸ÀûÀ¸·Î ¾ÈÀüÇÏ°Ô º¸°üÇÒ ¼ö°¡ ÀÖ´Ù. ±×·¯³ª ´ç½ÅÀÌ ÀçÁ¶Á¤ ÇÒ ´çÀÚ¸¦ »ç¿ëÇÏ·Á ÇÒ ¶§´Â ¾ÈÀüÇÒ ¼ö°¡ ¾ø´Ù.¿Ö³ÄÇϸé,´ç½ÅÀÌ ¾î¶² ¹æ½ÄÀ¸·Îµç ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ·ÁÇÒ¶§ ¸¶´Ù ¸ðµç ÀçÁ¶Á¤°¡´ÉÇÑ ºí·°µéÀÌ ¿òÁ÷ÀÏ ¼ö Àֱ⠶§¹®ÀÌ´Ù. mallocÀ̳ª reallocÀ» È£ÃâÇÏ´Â ÀÏÁ¶Â÷ µµ ÀçÁ¶Á¤°¡´ÉÇÑ ºí·°µéÀ» ¿òÁ÷ÀÏ ¼ö ÀÖ´Ù.
°¢°¢ÀÇ ÀçÁ¶Á¤°¡´É ºí·°µé¿¡ ´ëÇØ¼ ´ç½ÅÀº ±× ºí·°ÀÇ ÁÖ¼Ò°¡ ÀúÀåµÉ ¼ö ÀÖµµ·Ï ¸Þ¸ð¸®»ó¿¡ ÇÚµé_ Æ÷ÀÎÅÍ ÁöÁ¤À» ¸¸µé¾î¾ß ÇÑ´Ù. ÀçÁ¶Á¤ ÇÒ´çÀÚ´Â °¢ ºí·°ÀÇ ÇÚµéÀÇ À§Ä¡¸¦ ¾Ë°í ÀÖ¾î¼ ºí·°À» ¿Å±æ ¶§¸¶´Ù ±×°÷¿¡ ÀúÀåµÈ ÁÖ¼Ò¸¦ °»½ÅÇϸç,±× °á°ú·Î ÇÚµéÀº ¾ðÁ¦³ª ±× ºí·°À» °¡¸®Å°°Ô µÈ´Ù.´ç½ÅÀÌ ºí ·°ÀÇ ³»¿ë¿¡ Á¢±ÙÇϰíÀÚ ÇÒ ¶§¸¶´Ù,Çڵ鿡¼ ±× ºí·°ÀÇ °»½ÅµÈ ÁÖ¼Ò¸¦ °¡Á®¿Í¾ß¸¸ ÇÑ´Ù.
ºÎÈ£Ãë±ÞÀڷκÎÅÍ ÀçÁ¶Á¤ ÇÒ´çÀÚ ÇÔ¼öµéÀ» È£ÃâÇÏ´Â °ÍÀº °ÅÀÇ ºÐ¸íÈ÷ ºÎÁ¤È®ÇÏ´Ù.¿Ö³ÄÇÏ¸é ±× ºÎÈ£ ´Â ¾ðÁ¦µçÁö º¯ÇÒ ¼ö ÀÖ°í ¸ðµç ºí·°À» ÀçÁ¶Á¤ÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù.À̰ÍÀ» ¾ÈÀüÇÏ°Ô ÇÒ ¼ö ÀÖ´Â À¯ ÀÏÇÑ ¹æ¹ýÀº ÀçÁ¶Á¤°¡´ÉÇÑ ¾î¶² ºí·°ÀÇ ³»¿ëµµ ±× ºÎÈ£¿¡ Á¢±ÙÇÏÁö ¸øÇϵµ·Ï ºÀ¼âÇÏ´Â °ÍÀÌ´Ù. 21.4.6 [ÀçÁøÀÔ±ÝÁö],290ÂÊ ÂüÁ¶.
3.6.2 ÀçÁ¶Á¤°¡´ÉÇÑ ºí·°ÀÇ ÇÒ´ç°ú ÇØÁ¦
¾Æ·¡ÀÇ ¼¼ú¿¡¼,handleptrÀÌ ÇÚµéÀÇ ÁÖ¼Ò¸¦ °¡¸®Å²´Ù. ¸ðµç ÇÔ¼öµéÀº 'malloc.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù;¸ð µç °ÍÀº GNUÀÇ È®ÀåÀÌ´Ù.
ÇÔ¼ö void * r__alloc (void **handleptr, size_t size)
ÀÌ ÇÔ¼ö´Â ÀçÁ¶Á¤°¡´ÉÇÑ size Å©±âÀÇ ºí·°À» ÇÒ´çÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ±× ºí·°ÀÇ ÁÖ¼Ò¸¦ *handleptr¿¡ ´ã °í ¼º°øÇßÀ» ¶§ ³Î(null)ÀÌ ¾Æ´Ñ ¹®ÀÚ¸¦ ¹ÝȯÇÑ´Ù. ¸¸¾à r_allocÀÌ ÇÊ¿äÇÑ °ø°£À» ¾òÁö ¸øÇϸé *handleptr¿¡ ³ÎÆ÷ÀÎÅ͸¦ ÀúÀåÇÏ°í³ª¼ ³ÎÆ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù.
ÇÔ¼ö void r__alloc__free (void **handleptr)
ÀÌ ÇÔ¼ö´Â ÀçÁ¶Á¤°¡´ÉÇÑ ºí·°À» ÇØÁ¦ÇÏ´Â ¿ëµµ·Î ¾²ÀδÙ. ÀÌ ÇÔ¼ö´Â *handleptrÀÌ °¡¸®Å°´Â ºí·°À» ÇØÁ¦ÇÏ°í ´õÀÌ»ó ¾î¶² ÇÒ´çµÈ ºí·°µµ °¡¸®Å°°í ÀÖÁö ¾ÊÀ½À» Ç¥½ÃÇϱâ À§ÇÏ¿© *handleptr¿¡ ³ÎÆ÷ÀÎÅÍ ¸¦ ´ã¾ÆµÐ´Ù.
ÇÔ¼ö void * r__re__alloc (void **handleptr, size_t size)
ÇÔ¼ö r_re_allocÀº *handleptrÀÌ °¡¸®Å°´Â ºí·°ÀÇ Å©±â¸¦ Á¶Á¤Çϴµ¥ size¹ÙÀÌÆ®¸¸Å Å©°Ô ÇÑ´Ù.ÀÌ ÇÔ ¼ö´Â *handleptr¿¡ Å©±â°¡ º¯ÇÑ ºí·°ÀÇ ÁÖ¼Ò¸¦ ÀúÀåÇÏ°í ¼º°øÀ» ÇÏ°ÔµÇ¸é ³ÎÀÌ ¾Æ´Ñ Æ÷ÀÎÅ͸¦ ¹Ýȯ ÇÑ´Ù. ¸¸¾à ÃæºÐÇÑ ¸Þ¸ð¸®¸¦ »ç¿ëÇÒ ¼ö ¾ø°Ô µÇ¸é,ÀÌ ÇÔ¼ö´Â ³Î Æ÷ÀÎÅ͸¦ ¹ÝȯÇϰí *handleptrÀ» º¯ °æÇÏÁö ¾Ê´Â´Ù.
3.7 ¸Þ¸ð¸® »ç¿ë °æ°í
´ç½ÅÀº memory_warnings¸¦ È£ÃâÇÔÀ¸·Î½á ÇÁ·Î±×·¥ÀÌ ¸Þ¸ð¸® °ø°£À» ´Ù ½á¹ö¸®Áö ¾Êµµ·Ï °æ°í¸¦ ¿äûÇÒ ¼ö ÀÖ´Ù.ÀÌ ÇÔ¼ö´Â ¿î¿µÃ¼Á¦·ÎºÎÅÍ ´õ ¸¹Àº ¸Þ¸ð¸®¸¦ ¿äûÇÒ ¶§¸¶´Ù ¸Þ¸ð¸® »ç¿ëÀ» üũÇϵµ ·Ï malloc¿¡°Ô ¾Ë·ÁÁØ´Ù. À̰ÍÀº 'malloc.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Â GNUÀÇ È®ÀåÀÌ´Ù.
void memory__warnings (void *start, void (*warn_func) (const char function *))
½ÇÁ¦ÀûÀÎ ¸Þ¸ð¸®°¡ °í°¥µÇ¾î°¡°í ÀÖÀ½À» °æ°íÇÏ·ÁÇÒ ¶§ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇ϶ó.
Àμö start´Â ¸Þ¸ð¸®»ó¿¡¼ µ¥ÀÌÅÍ °ø°£ÀÌ ½ÃÀ۵Ǵ °÷À» ¸»ÇÑ´Ù. ÇÒ´çÀÚ´Â À̰ÍÀ» »ç¿ëµÈ ¸¶Áö¸· ÁÖ ¼Ò¿Í ´ëÁ¶ÇÏ°í ¶Ç µ¥ÀÌÅÍ °ø°£ÀÇ ÇѰè¿Í ´ëÁ¶ÇÏ¿©,»ç¿ë°¡´ÉÇÑ ¸Þ¸ð¸®ÀÇ ´ÜÆíÀ» »ç¿ëÅä·Ï °áÁ¤ÇÑ´Ù.¸¸ ¾à ´ç½ÅÀÌ start¿¡ 0À» ´ëÀÔÇÏ°Ô µÇ¸é ´ëºÎºÐÀÇ È¯°æ¿¡¼ ¾²ÀÏ ¼ö ÀÖ´Â ³»Á¤°ªÀÌ »ç¿ëµÇ°Ô µÈ´Ù.
°æ°íÇÔ¼ö¸¦ »ç¿ëÇÒ ¶§ mallocÀÌ ´ç½Å¿¡°Ô °æ°í¸¦ ÁÖ±â À§ÇØ È£ÃâÇÒ ¼ö ÀÖ´Â ÇÔ¼ö¸¦ »ç¿ëÇ϶ó.±×°Í Àº Àμö·Î¼ ¹®ÀÚ¿(°æ°í ¸Þ¼¼Áö)À» µ¿¹ÝÇÏ¿© È£ÃâµÈ´Ù.º¸Åë ±× ¹®ÀÚ¿Àº »ç¿ëÀÚ°¡ ÀÐÀ» ¼ö ÀÖ°Ô²û µð½ºÇ÷¹À̵ȴÙ.
°æ°í´Â ¸Þ¸ð¸®ÀÇ 75%, 85%, 95%¸¦ »ç¿ëÇßÀ» ¶§ ÁÖ¾îÁø´Ù. 95%°¡ ³Ñ¾úÀ» ¶§´Â ¸Þ¸ð¸®°¡ ¾²ÀÏ ¶§¸¶ ´Ù °æ°í¸¦ ¾òÀ» ¼ö ÀÖ´Ù.