Writing Efficient C and C Code Optimization
ÃÑ ÆäÀÌÁö ¼ö : 3121

Àüü ÇÔ¼ö/¿ë¾î»çÀü
ÇöÀçÀ§Ä¡ : ¹Ì´Ï»çÀÌÆ®>C>Documents>COptimization


Contents

1 ¼Ò°³
2 ¼±¾ð
3 ¾îµð¿¡ ÇÊ¿äÇѰ¡
3.1 Á¤¸» »¡¶óÁö´Â °¡ ?
4 µ¥ÀÌÅÍ ¿¬»ê
4.1 Á¤¼ö
4.2 ³ª´°¼À ±×¸®°í ³ª¸ÓÁö
4.3 Combining division and remainder
4.4 1 ºÎÅÍ n ±îÁö ´õÇϱâ
4.5 ¦¼ö Ȧ¼ö È®ÀÎ
4.6 2ÀÇ ¹è¼ö·Î ³ª´©±â
4.7 Binary Breakdown
4.8 ¹è¿­À» ÀÌ¿ëÇÑ index »ý¼º
4.9 ³ª¸ÓÁö ¿¬»êÀÚÀÇ ´ëü
4.10 Using Aliases
5 µ¥ÀÌÅÍ Å¸ÀÔ
5.1 Àü¿ª º¯¼ö
5.2 Áö¿ªº¯¼ö
5.3 Æ÷ÀÎÅÍ
5.4 Pointer chains
5.5 Switch ´ë½Å lookup table ¸¦ »ç¿ëÇ϶ó
6 ·çÇÁ
6.1 Loop termination
6.2 ´õ¿í ºü¸¥ for ¹®
6.3 Loop jamming
6.4 ÇÔ¼ö ·çÇÁ
6.5 Population count - ºñÆ® °è¼öÇϱâ
6.6 Earyl loop breaking
6.7 Loop »ç¿ëÇÏÁö ¾Ê±â
7 ÇÔ¼ö µðÀÚÀÎ
7.1 ÇÔ¼ö È£Ãâ Overhead
7.2 °¡´ÉÇÑ ÀÎÀÚÀÇ ¼ö¸¦ ÁÙ¿©¶ó
7.3 ÀζóÀÎ ÇÔ¼ö
8 Âü°í¹®Çå

1 ¼Ò°³

¾ó¸¶Àü¿¡ ¸ð¹ÙÀϱâ±â¿¡¼­ ÀÏÁ¤¼öÁØÀÇ Ç°ÁúÀ» À¯ÁöÇϸ鼭 ½ÇÇàµÇ´Â JPEG¶óÀ̺귯¸®¸¦ ¸¸µå´Â ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇÑÀûÀÌ ÀÖ¾ú´Ù. ÀÌ ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇϸ鼭, ¿©·¯°¡Áö ¹æ¹ýÀ¸·Î ÇÁ·Î±×·¥À» ´õ »¡¸® ¸¸µé ¼ö ÀÖ´Ù´Â »ç½ÇÀ» °æÇèÀûÀ¸·Î ¾Ë°Ô µÇ¾ú´Ù. ÀÌ ¹®¼­´Â C·ÎµÈ Äڵ带 ¼Óµµ¿Í ¸Þ¸ð¸® ¾çÃø¸ðµÎ¿¡¼­ ÃÖÀûÈ­Çϱâ À§ÇÑ °æÇèÀûÀÎ Á¤º¸µéÀ» Æ÷ÇÔÇϰí ÀÖ´Ù.

¹°·Ð ¿©·¯ºÐÀº C Äڵ带 ÃÖÀûÈ­ ÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ Âü°í¹®¼­¸¦ ¾î·ÆÁö ¾Ê°Ô ȹµæÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª ´ëºÎºÐÀÇ ¹®¼­°¡ ÆÁ¼öÁØ¿¡¼­ ¹®Á¦¿¡ Á¢±ÙÇÒ »ÓÀ¸·Î, ÄÄÆÄÀÏ·¯³ª ±â°è¾î¼öÁØ¿¡¼­ ¾î¶»°Ô ÇÁ·Î±×·¡¹ÖÀ» ÇØ¾ß ÇÏ´ÂÁö¿¡ ´ëÇÑ Á¤º¸´Â ´ã°í ÀÖÁö ¾Ê´Ù.

º¸Åë ÇÁ·Î±×·¥ÀÇ ¼Óµµ¸¦ ³ôÀÌ°Ô µÇ¸é ÄÚµåÀÇ Å©±â°¡ ´Ã¾î³ª°Ô µÈ´Ù. ÄÚµåÀÇ Å©±â°¡ ´Ã¾î³ª¸é ÇÁ·Î±×·¥ÀÌ º¹ÀâÇØÁö°í, Àаí ÀÌÇØÇϱ⠾î·Á¿öÁø´Ù. ¸Þ¸ð¸® ÀÚ¿øÀÌ ³Ë³ËÇÑ °³ÀÎPCȤÀº ¼­¹ö ÄÄÇ»ÅͶó¸é ¹®Á¦°¡ µÇÁö ¾Ê°ÚÁö¸¸ PDA¿Í °°Àº Á¦ÇÑµÈ ¸Þ¸ð¸® ÀÚ¿øÀ» °¡Áø ±â±âÀÏ °æ¿ì ½É°¢ÇÑ ¹®Á¦°¡ µÉ ¼ö ÀÖ´Ù. 1%ÀÇ ¼ÓµµÇâ»óÀ» À§Çؼ­ ÄÚµåÀÇ Å©±â°¡ 10%¸¸Å­ ´Ã¾î³­´Ù¸é ºÐ¸í ¹®Á¦°¡ µÉ °ÍÀÌ´Ù. ÀÌ·± ÀÌÀ¯·Î ¼Óµµ¿Í ÄÚµåÅ©±â ¸ðµÎ¿¡ ´ëÇÑ ÃÖÀûÈ­¸¦ ¼öÇàÇϱâ·Î °áÁ¤À» Çß´Ù.

2 ¼±¾ð

³»°¡ ÁøÇàÇÏ´Â ÇÁ·ÎÁ§Æ®°¡ ARM Ç÷§Æû¿¡¼­ ÁøÇàµÈ °ü°è·Î, ARM ÃÖÀûÈ­¿Í °ü·ÃµÈ ÆÁµéÀÌ ÇÊ¿äÇß¾ú´Ù. ³ª´Â ÀÎÅͳÝÀ» ÅëÇØ¼­ ARM ÃÖÀûÈ­¿Í °ü·ÃµÈ ¸¹Àº ¹®¼­¸¦ °Ë»öÇϰí ÀÌÁß À¯¿ëÇÑ °Íµé Áß½ÉÀ¸·Î ¼öÁýÇØ¼­ Å×½ºÆ®¸¦ Çß¾ú´Ù. ±×·¯³ª ´ëºÎºÐÀÇ ¹®¼­µéÀÌ ³ª¿¡°Ô´Â µµ¿òÀÌ µÇÁö ¾Ê¾ÒÀ½À» °í¹éÇÑ´Ù. ÀÌ·¯ÇÑ ½Ç¼ö¸¦ ÁÙÀ̱â À§Çؼ­ À¯¿ëÇϰí È¿°úÀûÀÎ ¸î°³ÀÇ ÆÁ¸¸À» ¸ðÀ¸±â·Î °áÁ¤Çß´Ù.

3 ¾îµð¿¡ ÇÊ¿äÇѰ¡

Åä·ÐÀÇ ÁÖÁ¦¸¦ ¸íÈ®È÷ ÇÏ°í ³Ñ¾î°¡ÀÚ. ÄÄÇ»ÅÍ ÇÁ·Î±×·¥À» ÃÖÀûÈ­Çϱâ À§ÇÑ °¡Àå Áß¿äÇÑ °ÍÀº ÇÁ·Î±×·¥À» ÀÌ·ç´Â °¢°¢ÀÇ ¸ðµâÁß ¾î´À ºÎºÐÀÌ ´À¸®°Ô ÀÛµ¿Çϰųª, Å« ¸Þ¸ð¸®¸¦ ¼ÒºñÇÏ´ÂÁö¸¦ ã¾Æ³»´Â °ÍÀÌ´Ù. ÀÌµé °¢°¢ÀÇ ºÎºÐÀ» ÃÖÀûÈ­Çϸé ÇÁ·Î±×·¥ÀÌ ÀüüÀûÀ¸·Î »¡¶óÁú °ÍÀ̱⠶§¹®ÀÌ´Ù. ÀÌ·¯ÇÑ ¸ðµâ´ÜÀ§ÀÇ ÃÖÀûÈ­´Â ÃÖÀûÈ­¸¦ À§ÇÑ ºÎºÐÀ» ºñ±³Àû ½±°Ô ã°í, ½±°Ô ÇØ°áÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡À» °¡Áø´Ù.

The optimizations should be done on those parts of the program that are run the most, especially those methods which are called repeatedly by various inner loops that the program can have.

ÀϹÝÀûÀ¸·Î °æÇèÀÌ Ç³ºÎÇÑ ÇÁ·Î±×·¡¸ÓµéÀº ¾ÆÁÖ ½±°Ô ÇÁ·Î±×·¥ÀÌ ¿ä±¸ÇÏ´Â ÃÖÀûÈ­µÉ Çʿ䰡 ÀÖ´Â ÇÙ½ÉÀ» ½±°Ô ã¾Æ³¾ ¼ö ÀÖÀ» °ÍÀÌ´Ù. °¡Àå ÁÁÀº ÃÖÀûÈ­ ¹æ¹ýÀº °æÇ踹Àº ÇÁ·Î±×·¡¸Ó¸¦ °í¿ëÇÏ´Â °ÍÀÌ´Ù. ±×·¯³ª °æÇ踹Àº ÇÁ·Î±×·¡¸Ó´Â ¸Å¿ì µå¹°¸ç, °æÇèÀÌ ¸¹´Ù°í ÇØµµ ´õ ÁÁÀº °á°ú¸¦ À§Çؼ­´Â ÃÖÀûÈ­¸¦ À§ÇÑ ÁÁÀº ÅøÀ» »ç¿ëÇÒ Çʿ䰡 ÀÖ´Ù. Visual C++ °ú °°Àº ÅëÇÕ °³¹ßȯ°æÀº ÇÔ¼ö´ÜÀ§·Î ÇÁ·Î±×·¥ÀÇ ¼Òºñ½Ã°£À» ÃøÁ¤ÇÒ ¼ö ÀÖ´Â profiler¸¦ Á¦°øÇÑ´Ù. ¸®´ª½ºÀÇ °æ¿ì¿¡´Â gprof¿Í °°Àº profiler¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ȤÀº Intel Vtune¿Í °°Àº ÇÁ·Î±×·¥À» »ç¿ëÇÒ ¼ö Àִµ¥, À̵é ÇÁ·Î±×·¥À» »ç¿ëÇϸé ÇÁ·Î±×·¥ÀÇ ¾î´ÀºÎºÐÀÌ °¡Àå ¸¹Àº ½Ã°£À» ¼ÒºñÇÏ´ÂÁö¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Ù. °³ÀÎÀûÀÎ °æÇèÀ¸·Î ·çÇÁ ȤÀº third party ¶óÀ̺귯¸® ¸Þ¼­µå¸¦ È£ÃâÇÏ´Â ¿µ¿ªÀÌ ÇÁ·Î±×·¥À» ´À¸®°Ô ÇÏ´Â °æ¿ì°¡ ¸¹¾Ò´Ù.

3.1 Á¤¸» »¡¶óÁö´Â °¡ ?

¾Æ·¡ÀÇ ÃÖÀûÈ­ ±â¹ýÀ» Àû¿ëÇÑ´Ù°í ÇØ¼­, Ç×»ó »¡¶óÁø´Ù´Â °É º¸ÀåÇÒ ¼ö´Â ¾ø´Ù. ÄÄÆÄÀÏ·¯ÀÇ ¹öÀü°ú Á¾·ù, ¸¸µé°íÀÚ ÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀÇ Æ¯Â¡¿¡ µû¶ó¼­ °á°ú°¡ ´Þ¶óÁú ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¸¸¾à ÀÓº£µðµå±â±â¿¡ ¿Ã¶ó°¡´Â ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¾Æ´Ñ, °í¼öÁØÀÇ ¾ÖÇø®ÄÉÀ̼ÇÀÇ °³¹ßÀÌ ¸ñÀûÀ̶ó¸é ¾Æ·¡ÀÇ ÃÖÀûÈ­ ±â¹ýÀº ±×´ÙÁö ¼Ò¿ëÀÌ ¾øÀ» °ÍÀÌ´Ù. °í¼öÁØ ¾ÖÇø®ÄÉÀ̼ÇÀ̶ó¸é, ¹Ì¼¼ÇÑ ¼º´ÉÃÖÀûÈ­¸¦ À§ÇÑ ³ë·ÂÇÏ´Â °Í º¸´Ù´Â ÁÖ¿ä µ¥ÀÌÅÍó¸® ¾Ë°í¸®Áò°ú °¡µ¶¼º¿¡ ½Å°æÀ» ¾²´Â°Ô ´õ ³ªÀº °á°ú¸¦ º¸¿©ÁÙ °ÍÀÌ´Ù.

4 µ¥ÀÌÅÍ ¿¬»ê

4.1 Á¤¼ö

¿ì¸®°¡ »ç¿ëÇÒ °ªÀÌ À½¼ö°¡ ¾Æ´Ï¶ó¸é int Çü´ë½Å¿¡ unsigned intÇüÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. ¾î¶² ÇÁ·Î¼¼½ºµéÀº unsigned integerÀÇ ¿¬»êÀÌ signed ¿¬»êº¸´Ù ¸Å¿ì ºü¸£´Ù. ¶ÇÇÑ ³ª´©±â/³ª´°¼À ÀÛ¾÷ÀÇ °æ¿ì¿¡µµ À½¼ö°¡ ÇÊ¿ä ¾ø´Ù¸é unsigned ¸¦ ¸í½ÃÇØÁÖ´Â°Ô ÁÁ´Ù.

·çÇÁ¿¡ »ç¿ëµÉ º¯¼ö¶ó°í ÇÑ´Ù¸é, ´ÙÀ½°ú °°ÀÌ ±ò²ûÇϰí È¿À²ÀûÀ¸·Î ¼±¾ðÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
register unsigned int variable_name; 
 

±â¾ïÇØ¾ßÇÒ ¶Ç´Ù¸¥ Á¡Àº floating point ¿¬»êÀº ¸Å¿ì ´À¸®´Ù¶ó´Â Á¡ÀÌ´Ù. floating point µ¥ÀÌÅÍ Å¸ÀÔÀº ÀÚ¹Ù¿Í ÇÔ²² ÇÏ´Â ÄÄÇ»ÅͰúÇй®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù. ô ºÁµµ floating point ¼ýÀÚ´Â ´Ù·ç±â°¡ ²Ï³ª º¹ÀâÇÏ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸¸¾à ¿©·¯ºÐÀÌ ¼Ò¼ýÁ¡ 2ÀÚ¸®±îÁöÀÇ Á¤È®µµ¸¦ À¯ÁöÇϴ ȸ°èÇÁ·Î±×·¥À» ¸¸µç´Ù¸é, ¸ðµç °ª¿¡ x100À»Çؼ­ int ÇüÀ¸·Î ¹Ù²Û´ÙÀ½ ¿¬»êÀ» Çϵµ·Ï ÇÑ´Ù. °¡´ÉÇÏ¸é ¿ÜºÎÀÇ ¼öÇжóÀ̺귯¸®¸¦ »ç¿ëÇÏÁö ¾Êµµ·Ï ÇÑ´Ù. FPUs¿Í °°Àº ¶óÀ̺귯¸®´Â ¸Å¿ì ´À¸®´Ù.

4.2 ³ª´°¼À ±×¸®°í ³ª¸ÓÁö

Ç¥ÁØÀûÀÎ ÇÁ·Î¼¼¼­¿¡¼­ÀÇ ºÐ¸ð¿Í ºÐÀÚÀÇ 32bit ³ª´°¼ÀÀº 20~140ÀÇ ½ÇÇà »çÀÌŬÀ» °¡Áö°í ÀÖ´Ù. ³ª´°¼ÀÀ» ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°Àº ½Ã°£ÀÌ ¼ÒºñµÈ´Ù.
Time (numerator / denominator) = C0 + C1* log2 (numerator / denominator) 
= C0 + C1 * (log2 (numerator) - log2 (denominator)). 
 
³Î¸® ¾²ÀÌ´Â ¹öÁ¯Àº ¾à 20+4.3NÀÇ »çÀÌŬÀ» º¸¿©ÁØ´Ù. ARM »Ó¸¸ ¾Æ´Ï¶ó ÇÁ·Î¼¼¼­¸¦ ¸··ÐÇϰí ÀÌ·± ¿¬»êÀº ÇÇÇÏ´Â°Ô ¹Ù¶÷Á÷ÇÏ´Ù. ³ª´°¼À¿¬»êÀº °¡´ÉÇÏ´Ù¸é °ö¼ÀÀ¸·Î ´ëÃ¼ÇØ¼­ »ç¿ëÇϱ⠹ٶõ´Ù.

¿¹¸¦µé¾î (a/b) > c ´Â b * c°¡ integer ¹üÀ§¾ÈÀ̶ó´Â °ÍÀ» ¾È´Ù¸é a > (c * b)·Î ´Ù½Ã ¾²ÀÏ ¼ö ÀÖ´Ù.

4.3 Combining division and remainder

³ª´°¼À (x/y) ±×¸®°í ³ª¸ÓÁö(x%y)µÑ´Ù Á¾Á¾ ÇÊ¿äÇÑ ÄÉÀ̽ºÀÌ´Ù
±×·¯ÇÑ ÄÉÀ̽º¿¡ ºñÃ߾¾Æ ³ª´°¼ÀÆã¼ÇÀ» ÄÄÆÄÀÏ·¯¿¡ °áÇÕÇϴ°ÍÀÌÁÁ´Ù ¿Ö³ÄÇÏ¸é ³ª´°¼ÀÆã¼ÇÀº Ç×»ó ³ª´«°ª°ú ³ª¸ÓÁö¸¦ ¸®ÅÏÇϱâ ÇÊ¿äÇÏ´Ù ¸¸¾àµÑ´Ù ÇÊ¿äÇÏ´Ù¸é ¿ì¸®´Â À̿Ͱ°Àº ¿¹Á¦¸¦ °°ÀÌ ¾µ¼öÀÖ¾î¾ßÇÑ´Ù
int func_div_and_mod (int a, int b) { 
        return (a / b) + (a % b); 
    } 
 

4.4 1 ºÎÅÍ n ±îÁö ´õÇϱâ

for (i = 0; i < n; i++) 
   sum += i; 
 
º¸´Ù´Â ¾Æ·¡°¡ ³´´Ù.
n(n+1) * 0.5 
 
õÀç ¼öÇÐÀÚÀÇ ¾î¸°½ÃÀý À̾߱⸦ µéÀº ±â¾ïÀÌ ÀÖ´Ù. ÀÚ¸®¸¦ ºñ¿î »çÀÌ ¾êµéÀÌ ³îÁö ¸øÇÏ°Ô ÇÏ·Á°í 1ºÎÅÍ 100±îÁö ´õÇ϶ó´Â ¹®Á¦¸¦ ³Â´Âµ¥, 5ºÐ¸¸¿¡ Ç®°í ³î¾Ò´õ¶õ ¾ê±â´Ù. (¼öÇÐÀÚ ÆÄ½ºÄ®ÀÇ ¾î¸°½ÃÀý ¾ê±âÀÌ´ø°¡ °¡¹°°¡¹° ÇÏ´Ù.)

¾î¶»°Ô Ç®¾ú³Ä°í ¹°¾îºÃ´õ´Ï. "1+100, 2+99, 3+98"ÀÌ°Ô 50¹ø ¹Ýº¹µÇ´õ¶ó´Â °ÍÀ̾ 101*50 ÇØ¼­ ´äÀ» ±¸Çß´Ù°í ´ë´äÇß´Ù°í ÇÑ´Ù. À̰ÍÀ» ´ë¼ö·Î ³ªÅ¸³»¸é n(n+1) * 0.5 ÀÌ ³ª¿Â´Ù.

¾à°£¸¸ ¼öÇÐÀûÀ¸·Î ¸Ó¸®¸¦ ±¼¸®´Â °ÍÀ¸·Î ¸Å¿ì Å« È¿°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ½Ã°£³ª¸é ´ë¼öÇÐÀ» °øºÎÇØº¸µµ·Ï ÇÏÀÚ.

4.5 ¦¼ö Ȧ¼ö È®ÀÎ

ºñÆ®¿¬»êÀ» Àß ÀÌ¿ëÇÏ¸é °£´ÜÇÏ°Ô °Ë»çÇÒ ¼ö ÀÖ´Ù.
1234 & 1 ? printf("¦¼ö\n"):printf("Ȧ¼ö\n"); 
ÀÌ·± ¹æ¹ýµµ °¡´ÉÇÏ´Ù. 
1234 << 31 ?  printf("¦¼ö\n"):printf("Ȧ¼ö\n"); 
 
´ç¿¬È÷ % ¿¬»êº¸´Ù ÈξÀ È¿À²ÀûÀÌ´Ù.

4.6 2ÀÇ ¹è¼ö·Î ³ª´©±â

³ª´©±â¸¦ ÇÒ ¶§ 2ÀÇ ¹è¼ö¸¦ ºÐÀÚ·Î ÇÔÀ¸·Î½á, Äڵ带 ´õ È¿À²ÀûÀ¸·Î ¸¸µé ¼ö ÀÖ´Ù. À̰æ¿ì¿¡ ÄÄÆÄÀÏ·¯´Â ³ª´©±â ¿¬»ê´ë½Å¿¡ shift ¿¬»êÀ» ÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. shift ¿¬»êÀº °¡Àåºü¸¥ ¿¬»êÁßÀÇ Çϳª´Ù. ±×·¯¹Ç·Î °¡´ÉÇϸé 2ÀÇ ¹è¼ö·Î ³ª´­ ¼ö ÀÖµµ·Ï ½ºÄÉÀÏÀ» Á¶ÀýÇÒ Çʿ䰡 ÀÖ´Ù. (¿¹¸¦ µé¾î 66À¸·Î ³ª´©¾î¾ß ÇÑ´Ù¸é 64·Î ³ª´­ ¼ö ÀÖµµ·Ï ½ºÄÉÀÏÀ» Á¶ÀýÇ϶ó).
typedef unsigned int uint; 
 
 uint div32u (uint a) { 
   return a / 32; 
 } 
 int div32s (int a){ 
   return a / 32; 
 } 
 
À̰æ¿ì¿¡µµ signed °ªº¸´Ù´Â unsigned ·Î ³ª´©¾îÁú ¼ö ÀÖµµ·Ï ÇÔ¼ö¸¦ Á¶ÀýÇÒ Çʿ䰡 ÀÖ´Ù. signedÀÇ °æ¿ì¿¡´Â ´õ¸¹Àº ½Ã°£ÀÌ ¼ÒºñµÈ´Ù. ¿Ö³ÄÇÏ¸é ¿À¸¥ÂÊÀ¸·Î ½¬ÇÁÆ® ½Ãų°æ¿ì °¡Àå¿ÞÂÊÀÇ ºñÆ®¸¦ 0À¸·Î ¸¸µé¾îÁÖ´Â ¿¬»êÀÌ Çѹø´õ µé¾î°¡±â ¶§¹®ÀÌ´Ù.

#include <stdio.h> 
 
int main() 
{ 
  unsigned int a = 1024; 
  unsigned b, c; 
  b = a/32;    // --- 1 
  c = a >> 5;  // --- 2 
} 
 
1°ú 2´Â µ¿ÀÏÇÑ °á°ú¸¦ º¸¿©ÁÖ¸ç, ÄÄÆÄÀÏ·¯³»¿¡¼­µµ µ¿ÀÏÇÏ°Ô shift 󸮵ȴÙ. ´ÙÀ½Àº intel ÇÁ·Î¼¼¼­¿¡¼­ gcc·Î ÄÄÆÄÀÏµÈ ¾î¼Àºí¸®¾îÁß 1°ú 2¿¡ ÇØ´çµÇ´Â ºÎºÐÀÇ ÄÚµå´Ù.
movl    $1024, -12(%ebp) 
movl    -12(%ebp), %eax 
shrl    $5, %eax           # b = a / 32 
movl    %eax, -8(%ebp) 
movl    -12(%ebp), %eax 
shrl    $5, %eax           # c = a >> 5 
 

4.7 Binary Breakdown

¿©·¯°³ÀÇ Á¶°ÇÀ» °Ë»çÇÏ´Ù º¸¸é, if¿Í else if¸¦ ¿©·¯°³ »ç¿ëÇÏ´Â °æ¿ì°¡ »ý±ä´Ù.
if(a==1) {  
} else if(a==2) {  
} else if(a==3) {  
} else if(a==4) {  
} else if(a==5) {  
} else if(a==6) {  
} else if(a==7) {  
} else if(a==8)  
 
{  
} 
 
À̰æ¿ì 2°³·Î ³ª´©¾î¼­ Á¶°Ç °Ë»ç¸¦ Çϵµ·Ï ÇÑ´Ù.
if(a<=4) {  
    if(a==1)     {  
    }  else if(a==2)  {  
    }  else if(a==3)  {  
    }  else if(a==4)   {  
   
    }  
}  
else  
{  
    if(a==5)  {  
    } else if(a==6)   {  
    } else if(a==7)  {  
    } else if(a==8)  {  
    }  
} 
 
ÀÌ·¸°Ô Çϸé ÃÖ¾ÇÀÇ °æ¿ì ºñ±³È½¼ö°¡ Àý¹ÝÀÌ µÊÀ» ¾Ë ¼ö ÀÖ´Ù. Çʿ信 µû¶ó¼­´Â ¾Æ·¡¿Í °°ÀÌ 3Áß·çÇÁ ÄÚµå·Î ¸¸µé ¼öµµ ÀÖ´Ù. Á»´õ ºü¸£°Ô µ¿ÀÛÇϱä ÇϰÚÁö¸¸ Äڵ尡 º¸±â ¾î·Á¿öÁø´Ù´Â ´ÜÁ¡ÀÌ »ý±ä´Ù.
if(a<=4)  
{  
    if(a<=2)  
    {  
        if(a==1)  
        {  
            /* a is 1 */  
        }  
        else  
        {  
            /* a must be 2 */  
        }  
    }  
    else  
    {  
        if(a==3)  
        {  
            /* a is 3 */  
        }  
        else  
        {  
            /* a must be 4 */  
        }  
    }  
}  
else  
{  
    if(a<=6)  
    {  
        if(a==5)  
        {  
            /* a is 5 */  
        }  
        else  
        {  
            /* a must be 6 */  
        }  
    }  
    else  
    {  
        if(a==7)  
        {  
            /* a is 7 */  
        }  
        else  
        {  
            /* a must be 8 */  
        }  
    }  
} 
 

4.8 ¹è¿­À» ÀÌ¿ëÇÑ index »ý¼º

ƯÁ¤°ª¿¡ ´ëÀÀµÇ´Â ¹®ÀÚ¸¦ º¯¼ö¿¡ ÀÔ·ÂÇÏ´Â Äڵ带 ¸¸µç´Ù¸é ´ÙÀ½°ú °°ÀÌ switch ¹®À» »ç¿ëÇÒ °ÍÀÌ´Ù.
switch ( queue ) { 
  case 0 :   letter = 'W'; 
     break; 
  case 1 :   letter = 'S'; 
     break; 
  case 2 :   letter = 'U'; 
     break; 
} 
 
ȤÀº if else ¹®À» »ç¿ëÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù.
 if ( queue == 0 ) 
   letter = 'W'; 
 else if ( queue == 1 ) 
   letter = 'S'; 
 else 
   letter = 'U'; 
 

´ÙÀ½°ú °°ÀÌ ¹®ÀÚÀÇ ¹è¿­À» À妽ºÈ­ ÇÏ¸é ´õ ºü¸¥ Á¢±ÙÀÌ °¡´ÉÇÏ´Ù. - »ç¿ëÇϱ⵵ ½±´Ù -
static char *classes="WSU"; 
letter = classes[queue]; 
 

4.9 ³ª¸ÓÁö ¿¬»êÀÚÀÇ ´ëü

¿ì¸®´Â ³ª´°¼ÀÀÇ ³ª¸ÓÁö¸¦ ¾Ë±â À§Çؼ­ ³ª¸ÓÁö ¿¬»êÀÚ %¸¦ »ç¿ëÇÑ´Ù. À̰æ¿ì % ¿¬»ê´ë½Å ÆÇ´Ü¹®À» »ç¿ëÇØ¼­ ½Ã°£À» ÁÙÀÏ ¼ö ÀÖ´Ù. ¾Æ·¡ÀÇ µÎ Äڵ带 ºñ±³ÇØ º¸±â ¹Ù¶õ´Ù.
uint modulo_func1 (uint count) 
{ 
   return (++count % 60); 
} 
 
uint modulo_func2 (uint count) 
{ 
   if (++count >= 60) 
  count = 0; 
  return (count); 
} 
 
if ¹®Àº ³ª¸ÓÁö ¿¬»êÀÚº¸´Ù ºü¸¥Äڵ带 »ý¼ºÇÑ´Ù. ÁÖÀÇ ÇÒÁ¡Àº 2¹øÂ° ÇÔ¼öÀÇ °æ¿ì 0¿¡¼­ 60»çÀÌÀÇ °ª¿¡ ´ëÇØ¼­¸¸ Á¦´ë·Î ÃøÁ¤ÀÌ µÈ´Ù´Â Á¡ÀÌ´Ù.


4.10 Using Aliases

¾Æ·¡ÀÇ Äڵ带 º¸±â ¹Ù¶õ´Ù.
  void func1( int *data )    { 
      int i; 
 
     for(i=0; i<10; i++)  
     { 
            anyfunc( *data, i); 
     } 
  } 
 

*data °¡ °áÄÚ º¯ÇÏÁö ¾Ê´Â´Ù°í ÇÏ´õ¶óµµ, anyfunc ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÄÄÆÄÀÏ·¯´Â ÀÌ°É ¾Ë ¼ö°¡ ¾ø´Ù. ±×·¡¼­ º¯¼ö°¡ »ç¿ëµÉ ¶§¸¶´Ù ¸Þ¸ð¸®·Î ºÎÅÍ ´Ù½Ã ÀоîµéÀÌ°Ô µÈ´Ù. ÀÌ ¹®Á¦´Â Áö¿ªº¯¼ö¸¦ Çϳª´õ µÒÀ¸·Î½á ÇØ°áÇÒ ¼ö ÀÖ´Ù.
  void func1( int *data ) 
  { 
      int i; 
      int localdata; 
 
      localdata = *data; 
      for(i=0; i<10; i++) 
      { 
          anyfunc ( localdata, i); 
      } 
  } 
 

5 µ¥ÀÌÅÍ Å¸ÀÔ

C ÄÄÆÄÀÏ·¯´Â char, short, int, long, float, double µîÀÇ ´Ù¾çÇÑ ¿ø½Ã µ¥ÀÌÅÍ Å¸ÀÔÀ» Á¦°øÇÑ´Ù. ÇÊ¿äÇÑ ¿µ¿ª¿¡ ÇÊ¿äÇÑ ¼öÁØÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀ» »ç¿ëÇϵµ·Ï ÇÏÀÚ.

5.1 Àü¿ª º¯¼ö

Àü¿ª º¯¼ö´Â Àý´ë ·¹Áö½ºÅÍ¿¡ ÇÒ´çÇÒ ¼ö ¾ø´Ù. Æ÷ÀÎÅ͸¦ »ç¿ëÇÏ¿© °£Á¢ÀûÀ¸·Î ÇÒ´çÇϰųª ÇÔ¼öÈ£ÃâÀ» ÀÌ¿ëÇØ¼­ Àü¿ªº¯¼ö¸¦ º¯È¯ÇÒ ¼ö ÀÖ´Ù.

µû¶ó¼­ ÄÄÆÄÀÏ·¯´Â Àü¿ªº¯¼öÀÇ °ªÀ» ·¹Áö½ºÅÍ¿¡ ¿Ã·Á¼­ ij½¬ÇÒ ¼ö ¾ø°Ô µÇ°í ¶§¹®¿¡ ±Û·Î¹ú º¯¼ö¸¦ ÀÌ¿ëÇÒ ¶§¸¶´Ù ´Ù½Ã ÀоîµéÀÌ´Â ¿À¹ö·Îµå°¡ »ý±â°Ô µÈ´Ù. ±×·¯¹Ç·Î °¡´ÉÇÏ¸é ±Û·Î¹ú º¯¼ö¸¦ Á÷Á¢ È£ÃâÇÏ´Â ´ë½Å¿¡, ·ÎÄú¯¼ö¸¦ ÀÌ¿ëÇØ¼­ ÇÊ¿äÇÑ ¿¬»êÀ» ÇÏ°í ±× °á°ú¸¦ ±Û·Îº° º¯¼ö¿¡ ÇÒ´çÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇØ¾ß ÇÑ´Ù.
int f(void); 
int g(void); 
int h(void); 
int errs; 
void test1(void) 
{ 
  errs += f(); 
  errs += g(); 
  errs += h(); 
} 
void test2(void) 
{ 
  int localerrs = errs; 
  localerrs += f(); 
  localerrs += g(); 
  localerrs += h(); 
  errs = localerrs; 
} 
 
test1Àº ¸Å¹ø Àü¿ªº¯¼ö¸¦ ·ÎµåÇØ¾ß ÇÑ´Ù. ¹Ý¸é test2ÀÇ °æ¿ì ·¹Áö½ºÅÍ¿¡ µî·ÏµÈ localerrs¿¡ °ªÀ» ÀúÀåÇÏ°í ¸¶Áö¸·¿¡ Çѹø¸¸ Àü¿ªº¯¼ö¿¡ Á¢±ÙÇÔÀ» ¾Ë ¼ö ÀÖ´Ù.

5.2 Áö¿ªº¯¼ö

°¡´ÉÇϸé Áö¿ªº¯¼ö·Î char À̳ª short¸¦ »ç¿ëÇÏÁö ¾Êµµ·Ï ÇÑ´Ù. char¿Í short°¡ »ç¿ëµÉ °æ¿ì ÄÄÆÄÀÏ·¯´Â °ªÀ» ÀúÀåÇϱâ À§Çؼ­ 8bit ȤÀº 16bit¸¦ ÇÒ´çÇÑ ÈÄ, ³²´Â Å©±â¸¦ ÁÙÀÌ´Â ÀÛ¾÷À» ÇÏ°Ô µÈ´Ù. ÀÌ´Â 24bit, 16bit ¸¸Å­À» shift ½ÃŰ´Â ¿¬»êÀ» ÇÏ°Ô µÊÀ» ÀǹÌÇÑ´Ù. ±×·¯¹Ç·Î ÀԷµǴ µ¥ÀÌÅͰ¡ 8 ȤÀº 16 ºñÆ®¶ó°í ÇÏ´õ¶óµµ, 32bit·Î ¿¬»êÀ» Çϵµ·Ï ÇÔ¼ö¸¦ ¸¸µé Çʿ䰡 ÀÖ´Ù.
int wordinc (int a) 
{  
   return a + 1; 
} 
short shortinc (short a) 
{  
    return a + 1; 
} 
char charinc (char a) 
{  
    return a + 1; 
} 
 
3¹øÂ° Äڵ尡 °¡Àå ºü¸¥°á°ú¸¦ º¸¿©ÁÙ °ÍÀ̶ó°í »ý°¢ÇÒÁöµµ ¸ð¸£Áö¸¸, 1¹øÂ° Äڵ尡 °¡Àå ºü¸£°Ô ÀÛµ¿ÇÑ´Ù.

5.3 Æ÷ÀÎÅÍ

±¸Á¶Ã¼¸¦ ±×´ë·Î ³Ñ±æ°æ¿ì ±¸Á¶Ã¼ÀÇ ¸ðµç °ªÀÌ ½ºÅÿ¡ ¿Ã¶ó°¡±â ¶§¹®¿¡ ´À¸®°Ô ÀÛµ¿ÇÑ´Ù. ±×·¡¼­ ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅ͸¦ ³Ñ±â´Â °æ¿ì°¡ ¸¹´Ù. ³ª´Â ¼ö kbyteÀÇ ±¸Á¶Ã¼¸¦ ³Ñ±â´Â ÇÁ·Î±×·¥À» º»ÀûÀÌ ÀÖ´Ù. ÀÌ·± °æ¿ì Æ÷ÀÎÅ͸¦ ¾²µµ·Ï ÇÏÀÚ.

Æ÷ÀÎÅ͸¦ ÅëÇØ¼­ ±¸Á¶Ã¼¸¦ ³Ñ±æ¶§, ±¸Á¶Ã¼ÀÇ ¸â¹ö¸¦ ¼öÁ¤ÇÒÀÏÀÌ ¾ø´Ù¸é »ó¼ö·Î ¼±¾ðÇØ¼­ ³Ñ±âµµ·Ï ÇÏÀÚ.
void print_data_of_a_structure ( const Thestruct  *data_pointer) 
{ 
   ...printf contents of the structure... 
} 
 
ÀÌ·¸°Ô Çϸé ÄÄÆÄÀÏ·¯´Â ÀÎÀÚ·Î ³Ñ¾î¿Â Æ÷ÀÎÅͰ¡ ¼öÁ¤ÇÒ ¼ö ¾ø´Â ¿ÜºÎ ±¸Á¶Ã¼¶ó´Â °ÍÀ» ¾Ë°Ô µÈ´Ù. ÀÌ·¸°Ô µÇ¸é, °ªÀÌ »ç¿ëµÉ ¶§¸¶´Ù ´Ù½Ã ÀÐÇôÁú Çʿ䰡 ¾ø¾îÁö°Ô µÈ´Ù. ¶ÇÇÑ ÀÌ·¯ÇÑ ÄÚµå´Â ½Ç¼ö·Î ±¸Á¶Ã¼ ¸â¹öÀÇ º¯¼ö¸¦ ¹Ù²Ù´Â °Í°ú °°Àº ½Ç¼ö¸¦ ÇÏÁö ¾Êµµ·Ï ÇØÁØ´Ù.

5.4 Pointer chains

±¸Á¶Ã¼³»ÀÇ Á¤º¸¿¡ Á¢±ÙÇÏ·Á´Ù º¸¸é Æ÷ÀÎÅÍÀÇ chainÀ» »ç¿ëÇØ¾ß ÇÒ ¶§°¡ ÀÖ´Ù. ´ÙÀ½°ú °°Àº °æ¿ì´Ù.
typedef struct { int x, y, z; } Point3; 
typedef struct { Point3 *pos, *direction; } Object; 
 
void InitPos1(Object *p) 
{ 
   p->pos->x = 0; 
   p->pos->y = 0; 
   p->pos->z = 0; 
} 
 
ÀÌ·² °æ¿ì p->pos ¸¦ ´Ù¸¥ Æ÷ÀÎÅÍ¿¡ ÇÒ´çÇØ¼­ Á¢±ÙÇϵµ·Ï ÇÏÀÚ. ÀÌ·¸°Ô Çϸé p->pos °¡ ij½¬µÇ¹Ç·Î Á»´õ È¿À²ÀûÀ¸·Î ÀÛµ¿ÇÏ°Ô µÈ´Ù.
void InitPos2(Object *p) 
{  
   Point3 *pos = p->pos; 
   pos->x = 0;  
   pos->y = 0; 
   pos->z = 0; 
} 
 
Äڵ尡 Á»´õ º¸±â ÁÁ¾ÆÁø´Ù´Â È¿°úµµ ³ë¸± ¼ö ÀÖ´Ù.

5.5 Switch ´ë½Å lookup table ¸¦ »ç¿ëÇ϶ó

switch´Â ´ÙÀ½°ú °°Àº °æ¿ì »ç¿ëÇÑ´Ù.
  • ¿©·¯°³ÀÇ ÇÔ¼öÁß Çϳª¸¦ È£ÃâÇØ¾ßÇÒ Çʿ䰡 ÀÖÀ» ¶§
  • ´Ù¾çÇÑ ¸®ÅϰªÀ» ³Ñ°Ü¹Þ°í À̸¦ ó¸®ÇØ¾ß ÇÒ¶§
  • ¿©·¯°³ÀÇ ÄÚµåÁß Çϳª¸¦ ½ÇÇà½ÃÄÑ¾ß ÇÒ¶§

¿¹¸¦ µé¾î¼­ Á¶°Ç°ªÀ» ÀԷ¹޾Ƽ­ °Å±â¿¡ ¸Â´Â ¹®ÀÚ¿­À» ¸®ÅÏÇÏ´Â ¾Æ·¡¿Í °°Àº Äڵ尡 ÀÖ´Ù°í °¡Á¤Çغ¸ÀÚ.
char * Condition_String1(int condition) { 
  switch(condition) { 
     case 0: return "EQ"; 
     case 1: return "NE"; 
     case 2: return "CS"; 
     case 3: return "CC"; 
     case 4: return "MI"; 
     case 5: return "PL"; 
     case 6: return "VS"; 
     case 7: return "VC"; 
     case 8: return "HI"; 
     case 9: return "LS"; 
     case 10: return "GE"; 
     case 11: return "LT"; 
     case 12: return "GT"; 
     case 13: return "LE"; 
     case 14: return ""; 
     default: return 0; 
  } 
} 
 
À§ÀÇ ÄÚµå´Â ¾Æ·¡¿Í °°ÀÌ Á» ´õ È¿À²ÀûÀÎ ÄÚµå·Î ¸¸µé ¼ö ÀÖ´Ù. ´ýÀ¸·Î º¸±â¿¡µµ ÆíÇÏ´Ù.
char * Condition_String2(int condition) { 
   if ((unsigned) condition >= 15) return 0; 
      return 
      "EQ\0NE\0CS\0CC\0MI\0PL\0VS\0VC\0HI\0LS\0GE\0LT\0GT\0LE\0\0" + 
       3 * condition; 
} 
 
ù¹øÂ° ·çƾÀº 240byte°¡ ÇÊ¿äÇÏÁö¸¸ µÎ¹øÂ° ·çƾÀº 72¹ÙÀÌÆ®¸¸ ¼Ò¸ðµÇ°í ÀÖ´Ù.

6 ·çÇÁ

·çÇÁ´Â ¸ðµç ÇÁ·Î±×·¥¿¡¼­ »ç¿ëµÇ´Âµ¥, ¸¹Àº °æ¿ì ·çÇÁ¿¡¼­ °ú´ÙÇÑ ½Ã°£À» ¼ÒºñÇÏ°Ô µÈ´Ù. ¿©·¯¹ø ½ÇÇàµÇ´Â ·çÇÁÆ· Ư¼º»ó Á¶±×¸¶ÇÑ ½Ã°£ÀÇ ³¶ºñ°¡ °Ô¼Ó ´©ÀûµÇ±â ¶§¹®ÀÌ´Ù.

6.1 Loop termination

·çÇÁ¸¦ Á¾·á½Ã۱â À§ÇÑ °Ë»ç´Â Ç×»ó count-down-to-zero ¹æ½ÄÀ» »ç¿ëÇϵµ·Ï ÇÑ´Ù. À̰ÍÀº Á»´õ ÀûÀº ½Ã°£À» ¼ÒºñÇÑ´Ù. ¾Æ·¡ÀÇ µÎ°³ÀÇ ¿¹Á¦´Â µ¿ÀÏÇÑ ÀÏÀ»ÇÑ´Ù. ´Ù¸¥Á¡ÀÌ ÀÖ´Ù¸é ù¹øÂ° ÄÚµå´Â ·çÇÁ¸¦ Áõ°¡½ÃŲ´Ù´Â Á¡ÀÌ°í µÎ¹øÂ°´Â ·çÇÁ¸¦ °¨¼Ò½ÃŲ´Ù´Â Á¡ÀÌ´Ù.
int fact1_func (int n) 
{ 
    int i, fact = 1; 
    for (i = 1; i <= n; i++) 
      fact *= i; 
    return (fact); 
} 
 
int fact2_func(int n) 
{ 
    int i, fact = 1; 
    for (i = n; i != 0; i--) 
       fact *= i; 
    return (fact); 
} 
 

6.2 ´õ¿í ºü¸¥ for ¹®

´ÙÀ½Àº 0ºÎÅÍ 10±îÁöÀÇ ¼ýÀÚ¸¦ ¿¬»êÇϱâ À§Çؼ­ for ¹®À» »ç¿ëÇÑ ÀϹÝÀûÀÎ ¿¹´Ù.
for (i = 0; i < 10; i++) {...} 
 
i´Â 0,1,2,3,4,5,6,7,8,9 ·Î 1¾¿ Áõ°¡ÇÒ °ÍÀÌ´Ù.

°¡´ÉÇÏ¸é ¾Æ·¡¿Í °°ÀÌ ¼ýÀÚ¸¦ °¨¼Ò½ÃŰ´Â ¹æÇâÀ¸·Î for ¹®À» »ç¿ëÇ϶ó.
for (i = 10; i--;) {...} 
 
ù¹øÀç Äڵ庸´Ù µÎ¹øÂ° Äڵ尡 ´õ ºü¸¥ ¼öÇà´É·ÂÀ» º¸¿©ÁØ´Ù.

µÎ¹øÂ° ÄÚµå´Â i°¡ 0ÀÌ ¾Æ´Ï¸é i¸¦ °¨¼Ò½ÃŰ°í ´ÙÀ½ Äڵ带 ÁøÇàÇ϶óÀÇ ÀǹÌÀε¥, Á¶°Ç °Ë»çÀÇ °æ¿ì 0ÀÎÁö ¾Æ´ÑÁö¸¦ ºñ±³Çϴµ¥ ´õ ÀÛÀº ½Ã°£ÀÌ ¼ÒºñµÇ±â ¶§¹®ÀÌ´Ù. ±×·¯¹Ç·Î µÎ¹øÂ° ÄÚµå´Â ¾Æ·¡¿Í °°ÀÌ ÀçÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. µÎ¹øÂ° ¿¹Á¦ÄÚµå º¸´Ù´Â ¾Æ·¡ÀÇ Äڵ尡 ´õ º¸±â ½¬¿ì¹Ç·Î, ¾Æ·¡ÀÇ Äڵ带 »ç¿ëÇÏ´Â°Ô °¡µ¶¼º Ãø¸é¿¡¼­ À¯¸®ÇÒ °ÍÀÌ´Ù.
for (i = 10; i ; i--) { } 
ȤÀº  
for (i = 10; i!=0; i--) { } 
 
À̵éÀº ¸ðµÎ µ¿ÀÏÇÑ ¼öÇà´É·ÂÀ» º¸¿©ÁØ´Ù.

6.3 Loop jamming


6.4 ÇÔ¼ö ·çÇÁ

ÇÔ¼ö´Â È£ÃâµÇ±â À§ÇÑ ºÐ¸íÇÑ ¿À¹öÇìµå°¡ Á¸ÀçÇÑ´Ù. ½ÇÇàÇØ¾ßµÉ ÇÔ¼ö°¡ ÀÖ´Â Æ÷ÀÎÅ͸¸ º¯°æÇÏ´Â°Ô ¾Æ´Ñ, °ªµéÀ» stack¿¡ pushÇÏ´Â °Í°ú »õ·Î¿î º¯¼öÀÇ ÇÒ´ç°ú °°Àº ÀÛ¾÷ÀÌ ¼öÇàµÇ±â ¶§¹®ÀÌ´Ù. ¶§¹®¿¡ ·çÇÁ¿¡¼­ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â µîÀÇ ÄÚµå´Â ÀÛ¼ºÇÏÁö ¾Ê´Â°Ô ÁÁ´Ù. ÀÌ·±·ùÀÇ ÄÚµå´Â ¹Ý´ë·Î ÇÔ¼ö¿¡¼­ ·çÇÁ¸¦ ¼öÇàÇϵµ·Ï º¯°æÇÏ´Â°É ÃßõÇÑ´Ù.

for(i=0 ; i<100 ; i++)  
{  
    func(t,i);  
}  
-  
-  
-  
void func(int w,d)  
{  
    lots of stuff.  
} 
 

À§ÀÇ ÄÚµå´Â ¾Æ·¡Ã³·³ ¹Ù²Ü ¼ö ÀÖ´Ù. µ¿ÀÏÇÑ ÀÏÀ» Á»´õ ºü¸£°Ô ¼öÇàÇÒ ¼ö ÀÖ´Ù.
func(t);  
-  
-  
-  
void func(w)  
{  
    for(i=0 ; i<100 ; i++)  
    {  
        //lots of stuff.  
    }  
} 
 

6.5 Population count - ºñÆ® °è¼öÇϱâ

¾Æ·¡ÀÇ ÄÚµå´Â´Â ÁÖ¾îÁø °ª¿¡ 1bit°¡ ¸î°³ÀÎÁö¸¦ °Ë»çÇÏ´Â ÄÚµå´Ù. 0000 1010 À̶ó¸é 2¸¦ ¸®ÅÏÇÏ´Â ½ÄÀÌ´Ù. ÀÌ·¯ÇÑ ºñÆ®Çʵå´Â ÀÏÁ¤ÇÑ ¹üÀ§ÀÇ °ªÀÌ ÂüÀÎÁö °ÅÁþÀÎÁö¸¦ ºü¸£°Ô üũÇϱâ À§Çؼ­ ³Î¸® »ç¿ëµÉ ¼ö ÀÖ´Ù.

´ÙÀ½°ú °°ÀÌ 1¾¿ ¿À¸¥ÂÊÀ¸·Î ½¬ÇÁÆ® Çϸ鼭, & ¿¬»êÀ» ÇÑ´Ù.
int countbit1(uint n) 
{ 
  int bits = 0; 
  while (n != 0) 
  { 
    if (n & 1) bits++; 
    n >>= 1; 
   } 
  return bits; 
} 
 

ÀÌ ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ 4¸¸Å­ ½¬ÇÁÆ® ÇÏ´Â ½ÄÀ¸·Î ¹Ù²ã¼­, ¼º´ÉÀ» ³ôÀÏ ¼ö ÀÖ´Ù.
int countbit2(uint n) 
{ 
   int bits = 0; 
   while (n != 0) 
   { 
      if (n & 1) bits++; 
      if (n & 2) bits++; 
      if (n & 4) bits++; 
      if (n & 8) bits++; 
      n >>= 4; 
   } 
   return bits; 
} 
 

6.6 Earyl loop breaking

·çÇÁ¸¦ »ç¿ëÇÏ´Ùº¸¸é, ÀÏÁ¤ Á¶°ÇÀÌ ¸¸Á·µÇ¸é µÚÀÇ ÇÁ·Î¼¼½º°¡ ´õÀÌ»ó ÇÊ¿ä ¾ø¾îÁö´Â °æ¿ì°¡ ÀÖ´Ù. ÀÌ °æ¿ì¿¡´Â break¸¦ ÀÌ¿ëÇØ¼­ ·çÇÁ¸¦ ¹þ¾î³ªµµ·Ï ÇÑ´Ù.
found = FALSE;  
for(i=0;i<10000;i++)  
{  
    if( list[i] == -99 )  
    {  
        found = TRUE;  
    }  
}  
 
if( found ) printf("Yes, there is a -99. Hooray!\n"); 
 

À§ÀÇ ÄÚµå´Â -99°¡ Æ÷ÇԵǾî ÀÖ´ÂÁö ¾Æ´ÑÁö¸¦ È®ÀÎÇÏ´Â ÇÁ·Î±×·¥À̹ǷÎ, ÀÏ´Ü ¹ß»ýÀÌ µÇ¾ú´Ù¸é, ·çÇÁ¸¦ µ¹ Çʿ䰡 ¾ø´Ù. ¾Æ·¡¿Í °°ÀÌ break ¹®À¸·Î ºüÁ®³ª°¡¸é ¾µµ¥¾ø´Â ·çÇÁÀÇ ³¶ºñ¸¦ ÁÙÀÏ ¼ö ÀÖ´Ù.
    found = FALSE;  
    for(i=0; i<10000; i++)  
    {  
        if( list[i] == -99 )  
        {  
            found = TRUE;  
            break;  
        }  
    }  
    if( found ) printf("Yes, there is a -99. Hooray!\n"); 
 

6.7 Loop »ç¿ëÇÏÁö ¾Ê±â

¸î¹ø¸¸ ¼øÈ¯ÇÏ´Â ·çÇÁÀÇ °æ¿ì Ç®¾î¾²¸é ¼º´ÉÀ» Çâ»ó½Ãų ¼ö ÀÖ´Ù - Äڵ尡 Á»´õ Ä¿Áö±ä ÇÑ´Ù -. ·çÇÁ¸¦ »ç¿ëÇÏÁö ¾Ê°Ô µÇ¸é, Ä«¿îÅ͸¦ À¯ÁöÇÏ°í ¾÷µ¥ÀÌÆ®ÇÏ°í ºñ±³ÇÏ´Â ÀÛ¾÷ÀÌ ±×¸¸Å­ ÁÙ¾îµé°Ô µÈ´Ù.
for(i=0; i<3; i++){  
    something(i); 
} 
 
º¸´Ù´Â ¾Æ·¡ÀÇ Äڵ尡 ´õ È¿À²ÀûÀÌ´Ù.
something(0); 
something(1); 
something(2); 
 

¿©Çϰ£¿¡ °¡´ÉÇÏ¸é ·çÇÁ¸¦ ÁÙÀÌ´Â°Ô ´õ È¿À²ÀûÀÌ´Ù. ¾Æ·¡ÀÇ ÄÚµå´Â ÇѹøÀÇ ·çÇÁ¿¡¼­ ºí·°´ÜÀ§·Î ÇÔ¼ö¸¦ È£ÃâÇÔÀ¸·Î½á, ·çÇÁÀÇ ¼ö¸¦ ÁÙÀ̰í ÀÖ´Ù.
//Example 1 
 
#include<STDIO.H>  
 
#define BLOCKSIZE (8)  
 
void main(void) 
{  
int i = 0;  
int limit = 33;  /* 33 ¹ø ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù */  
int blocklimit;  
 
/* The limit may not be divisible by BLOCKSIZE,  
 * go as near as we can first, then tidy up. 
 */  
blocklimit = (limit / BLOCKSIZE) * BLOCKSIZE;  
 
/* ÇѹøÀÇ ·çÇÁ¿¡¼­ 8¹øÀÇ ÇÔ¼ö¸¦ È£ÃâÇØ¼­ ·çÇÁÀÇ ¼øÈ¯È½¼ö¸¦ ÁÙÀ̰í ÀÖ´Ù. */  
while( i < blocklimit )  
{  
    printf("process(%d)\n", i);  
    printf("process(%d)\n", i+1);  
    printf("process(%d)\n", i+2);  
    printf("process(%d)\n", i+3);  
    printf("process(%d)\n", i+4);  
    printf("process(%d)\n", i+5);  
    printf("process(%d)\n", i+6);  
    printf("process(%d)\n", i+7);  
 
    /* counter ¾÷µ¥ÀÌÆ® */  
    i += 8;  
 
}  
 
/*  
 * 8ÀÇ ¹è¼ö¸¸Å­ ÇÔ¼ö¸¦ È£ÃâÇϰí ÀÖÀ¸¹Ç·Î, ó¸®ÇÏÁö ¸øÇÑ ÇÔ¼ö°¡ »ý±ä´Ù. 
 * ¾Æ·¡¿¡¼­ ó¸®ÇÏÁö ¸øÇÑ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. 
 */  
 
if( i < limit )  
{  
    /* Jump into the case at the place that will allow 
     * us to finish off the appropriate number of items.  
     */  
 
    switch( limit - i )  
    {  
        case 7 : printf("process(%d)\n", i); i++;  
        case 6 : printf("process(%d)\n", i); i++;  
        case 5 : printf("process(%d)\n", i); i++;  
        case 4 : printf("process(%d)\n", i); i++;  
        case 3 : printf("process(%d)\n", i); i++;  
        case 2 : printf("process(%d)\n", i); i++;  
        case 1 : printf("process(%d)\n", i);  
    } 
}  
 
} 
 

7 ÇÔ¼ö µðÀÚÀÎ

ÇÔ¼ö¸¦ ÀÛ°í °¡º±°Ô ¸¹µå´Â°Ç ÁÁÀº »ý°¢ÀÌ´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î½á ÄÄÆÄÀÏ·¯´Â register ÇÒ´ç°ú °°Àº ¿µ¿ª¿¡¼­ Á»´õ ½±°Ô ÃÖÀûÈ­ ÇÒ¼ö ÀÖ°Ô µÈ´Ù.

7.1 ÇÔ¼ö È£Ãâ Overhead

ÇÁ·Î¼¼¼­¿¡¼­ ÇÔ¼öÀÇ È£ÃâÀº ¿¹»ó°ú ´Þ¸® ±×¸® Å« ºñ¿ëÀÌ µéÁö´Â ¾Ê´Â´Ù. ÇÔ¼ö°¡ È£ÃâµÇ¸é register¿¡ ÇÔ¼öÀÇ ÀÎÀÚ¸¦ ³Ñ±â°Ô µÈ´Ù. ÀÌ ÀÎÀÚµéÀº char, short, int, float, structureµîÀÌ ¿Ã ¼ö ÀÖ´Ù. À̵é ÀÎÀÚ´Â ½ÇÁ¦ 4°³¸¸À» Àü´ÞÇÒ ¼ö ÀÖ´Ù´Â ÇѰ踦 °¡Áø´Ù. ÀÌ ÀÌ»óÀ¸·Î ÀÎÀÚ°¡ ³Ñ¾î°¡°Ô µÇ¸é, stack¸¦ ÀÌ¿ëÇØ¼­ ÇÔ¼öÀÇ ÀÎÀÚ¸¦ ³Ñ±â°Ô µÈ´Ù. ´ç¿¬È÷ ÇÔ¼ö¸¦ È£ÃâÇÔ¿¡ À־ OverHead°¡ ¹ß»ýÇÏ°Ô µÈ´Ù. ÇÔ¼öÈ£Ãâ½Ã ¹ß»ýÇÏ´Â ÀÎÀÚÀÇ Á¦ÇÑ¿¡ ´ëÇØ¼­´Â Linux¿¡¼­ÀÇ Assembly¹®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù.

¿¹Á¦ÄÚµå
    int f1(int a, int b, int c, int d) {  
       return a + b + c + d; 
    } 
 
    int g1(void) { 
       return f1(1, 2, 3, 4); 
    } 
 
 
    int f2(int a, int b, int c, int d, int e, int f) { 
      return a + b + c + d + e + f; 
    } 
 
    ing g2(void) { 
     return f2(1, 2, 3, 4, 5, 6); 
    } 
 
6°³ÀÇ ÀÎÀÚ¸¦ »ç¿ëÇÏ´Â f2¿Í g2ÇÔ¼ö´Â ½ºÅÿ¡ ÀúÀåµÇ¾î ÀÖ´Â ÀÎÀÚ¸¦ ²¨³»±â À§Çؼ­ 2¹øÀÇ ¸Þ¸ð¸® Á¢±ÙÀÌ ´õ ¹ß»ýÇÏ°Ô µÈ´Ù.

7.2 °¡´ÉÇÑ ÀÎÀÚÀÇ ¼ö¸¦ ÁÙ¿©¶ó

±×·¯¹Ç·Î °¡´ÉÇÑ ÀûÀº ¼öÀÇ ÀÎÀÚ¸¦ ³Ñ°Ü¹Þµµ·Ï ÇÔ¼ö¸¦ ¼³°èÇÒ Çʿ䰡 ÀÖ´Ù.
  • 4°³ ÀÌÇÏÀÇ ÀÎÀÚ¸¦ °¡Áöµµ·Ï ÇÔ¼ö¸¦ ¼³°èÇ϶ó. 4°³°¡ ³Ñ¾î°¡¸é ½ºÅÃÀ» ÅëÇØ¼­ ÀÎÀÚ¸¦ ³Ñ±â°Ô µÈ´Ù.
  • ¸¸¾à ÇÔ¼ö°¡ 4°³ ÀÌ»óÀÇ ÀÎÀÚ°¡ »ç¿ëµÇ¸é, ½ºÅÃÀ» ÅëÇØ¼­ ÀÎÀÚ¸¦ ³Ñ±â°Ô µÇ°í ½ºÅÃÀÇ Å©±â¸¸Å­ ¸Þ¸ð¸® Á¢±ÙÀÌ ¹ß»ýÇÏ°Ô µÈ´Ù.
  • ÀÌ·² °æ¿ì ±¸Á¶Ã¼¸¦ ¼±¾ðÇϰí, ±¸Á¶Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ³Ñ±â´Â ¹æ½ÄÀ» »ç¿ëÇϵµ·Ï ÇÑ´Ù.
  • ±¸Á¶Ã¼¸¦ »ç¿ëÇϸé ÀÎÀÚÀÇ ¾çÀ» ÁÙÀÏ ¼ö ÀÖÀ¸¸ç, ÄÚµå Ȱ¿ë¼ºµµ ³ô¾ÆÁö°Ô µÈ´Ù.
  • ÀÎÀÚ¿¡ »ç¿ëµÇ´Â ÀÚ·áÇüÀº longÅ©±â ÀÌ»óÀ¸·Î Çϵµ·Ï ÇÏÀÚ.
  • °¡º¯Àμö¸¦ »ç¿ëÇÏÁö ¸»¶ó. °¡º¯Àμö¸¦ »ç¿ëÇÏ°Ô µÇ¸é, ÀÎÀÚ°¡ stackÀ¸·Î ³Ñ¾î°¡°Ô µÈ´Ù.

7.3 ÀζóÀÎ ÇÔ¼ö

__inlineŰ¿öµå¸¦ ÀÌ¿ëÇϸé ÇÔ¼ö¸¦ ÀζóÀÎÈ­ ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. À̰ÍÀº ÀÏÁ¾ÀÇ ¸ÅÅ©·Î ó·³ ÀÛ¿ëÀ» Çϸç, ÇÔ¼ö°¡ È£ÃâµÇ´Â ´ë½Å ÇÔ¼öÀÇ º»Ã¼°¡ Á÷Á¢ ġȯÀÌ µÇ¾î ¹ö¸°´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î½á, ÇÔ¼ö¸¦ È£ÃâÇϴµ¥ µå´Â ºñ¿ëÀ» ÁÙÀÏ ¼ö ÀÖ°Ô µÈ´Ù. ¹Ý¸é Äڵ尡 ¸ðµÎ ġȯµÇ¾î ¹ö¸®¹Ç·Î, ÄÚµåÀÇ Å©±â°¡ Ä¿Áö°Ô µÈ´Ù.
    __inline int square(int x) { 
       return x * x; 
    } 
 
    #include <MATH.H> 
 
    double length(int x, int y){ 
        return sqrt(square(x) + square(y)); 
    } 
 
ÀζóÀÎ ÇÔ¼ö¸¦ ÀÌ¿ëÇÔÀ¸·Î½á ¾òÀ» ¼ö ÀÖ´Â À̵æÀº ´ÙÀ½°ú °°´Ù.
  • ÇÔ¼öÈ£ÃâÀ» À§ÇÑ ºñ¿ëÀÌ ¹ß»ýÇÏÁö ¾Ê´Â´Ù. Äڵ带 Á÷Á¢ ÀоîµéÀ̱⠶§¹®ÀÌ´Ù.
  • ÀϹÝÀûÀ¸·Î ÀÎÀÚ¸¦ ³Ñ±â´Â ¹æ½ÄÀº º¯¼ö¸¦ º¹»çÇÏ´Â °Íº¸´Ù ÀûÀº ºñ¿ëÀÌ µç´Ù. ¸¸¾à ÀÎÀÚ°¡ »ó¼ö¶ó¸é ÄÄÆÄÀÏ·¯´Â ´õ¿í ³ôÀº ¼öÁØÀÇ ÃÖÀûÈ­¸¦ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.