|
ÃÑ ÆäÀÌÁö ¼ö : 3121
![]()
|
ÇöÀçÀ§Ä¡ : ¹Ì´Ï»çÀÌÆ®>C>Documents>COptimization ![]() 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 jamming6.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 °¡´ÉÇÑ ÀÎÀÚÀÇ ¼ö¸¦ ÁÙ¿©¶ó
±×·¯¹Ç·Î °¡´ÉÇÑ ÀûÀº ¼öÀÇ ÀÎÀÚ¸¦ ³Ñ°Ü¹Þµµ·Ï ÇÔ¼ö¸¦ ¼³°èÇÒ Çʿ䰡 ÀÖ´Ù.
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)); }ÀζóÀÎ ÇÔ¼ö¸¦ ÀÌ¿ëÇÔÀ¸·Î½á ¾òÀ» ¼ö ÀÖ´Â À̵æÀº ´ÙÀ½°ú °°´Ù.
|
|
|
|
|