7. Practical considerations

7.1. Performance

ɸ½à STL ¤Î´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤ä¥Ð¥¤¥ó¥À¤Î¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤ÈƱÍÍ¤Ë ÍýÏÀŪ¤Ë¤Ï STL ¥¢¥ë¥´¥ê¥º¥à ¤ä ¦Ë¥Õ¥¡¥ó¥¯¥¿¤Î»ÈÍѤˤè¤ë ¼ê½ñ¤Î¥ë¡¼¥×¤ÈÈæ³Ó¤·¤¿Á´¤Æ¤Î¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤Ï ºÇŬ²½¤Ë¤è¤ê²ò¾Ã¤µ¤ì¤ë¡£ ¥³¥ó¥Ñ¥¤¥é¤Ë°Í¸¤·¤Æ¤¤¤ë¤â¤Î¤Î¡¢¤³¤ì¤Ï¼ÂºÝ¤ËÀµ¤·¤¤¡£ GCC 3.0.4 ¤ò»ÈÍѤ·¤Æ¡¢Intel Pentium 4 ¤Î 1.5 GHz ¤Î¥Þ¥·¥ó¾å¤Ç Æó¤Ä¤Î¥Æ¥¹¥È¤ò¹Ô¤Ê¤Ã¤¿¡£ºÇŬ²½¥Õ¥é¥°¤Ï -O3 ¤È¤·¤¿¡£

ºÇ½é¤Î¥Æ¥¹¥È¤Ç¤Ï¡¢¦Ë¥Õ¥¡¥ó¥¯¥¿¤ÈÌÀ¼¨Åª¤Ë½ñ¤¤¤¿´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤òÈæ³Ó¤·¤¿¡£ °ú¿ô¤Ë·«¤êÊÖ¤·¼«Ê¬¼«¿È¤ÎÃͤò¤«¤±¤ëñ¹à´Ø¿ô¤òξÊý¤Î·Á¤ÇÄêµÁ¤·¤¿¡£ ¹±Åù´Ø¿ô¤«¤é»Ï¤á¤Æ¡¢x5 ¤Þ¤Ç¼Â¸³¤ò¹Ô¤Ã¤¿¡£ ¤³¤Î¼°¤Ï std::transform ¤Î¥ë¡¼¥×¤ÎÆâÉô¤Ç¸Æ½Ð¤µ¤ì¡¢ ¤¢¤ë std::vector<int> ¤«¤é°ú¿ô¤òÆÉ¤ß½Ð¤·¡¢ ·ë²Ì¤òÊÌ¤Ê std::vector<int> ¤Ë³ÊǼ¤·¤¿¡£ vector ¤ÎÍ×ÁÇ¿ô¤Ï 100 ¤È¤·¤¿¡£ ¼Â¹Ô»þ´Ö¤Ï¡¢ Table 3 ¤Ë¼¨¤·¤Æ¤¢¤ë¡£ Æó¤Ä¤ÎÊýË¡¤ËÂ礭¤Êº¹¤Ï¤Ê¤¤¤³¤È¤¬Ê¬¤«¤ë¡£

Æó¤ÄÌܤΥƥ¹¥È¤Ç¤Ï¡¢100¸Ä¤ÎÍ×ÁǤΠvector ¤Î³ÆÍ×ÁǤËÂФ·¤ÆÁàºî¤ò¹Ô¤¦¤¿¤á¡¢ ºÆ¤Ó std::transform ¤ò»ÈÍѤ·¤¿¡£ º£²ó¤Ï¡¢vector ¤ÎÍ×ÁǤη¿¤Ï double ¤Ç¤¢¤ê¡¢ Èó¾ï¤Ë´Êñ¤Ê»»½Ñ¼°¤«¤é»Ï¤á¤Æ¡¢¾¯¤·¤º¤ÄÊ£»¨¤Ê¤â¤Î¤Ø¤È¤·¤Æ¤¤¤Ã¤¿¡£ ¼Â¹Ô»þ´Ö¤ò Table 4 ¤Ë¼¨¤¹¡£ ¤³¤³¤Ç¤Ï¡¢½¾Íè¤Î STL ¥¹¥¿¥¤¥ë¤Î̵̾´Ø¿ô¤â¥Æ¥¹¥È¤Ë²Ã¤¨¤Æ¤¤¤ë¡£ ¤³¤ì¤é¤Î¼°¤Ï¤è¤êÊ£»¨¤Ë¤Ê¤ë¤¿¤áÄ󼨤·¤Ê¤¤¡£ Î㤨¤Ð¡¢ Table 4 ¤ÎºÇ¸å¤Î¼°¤Ï¡¢½¾Íè¤Î STL ¤ÎÊýË¡¤Çµ­½Ò¤¹¤ë¤È¡¢ ¼·²ó¤Î compose2 ¤Î¸Æ½Ð¤·¤È¡¢È¬²ó¤Î bind1st ¤Î¸Æ½Ð¤·¡¢ multiplies¡¢minus¡¢plus ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½ÃÛ¤Ë ¹ç·×½½»Í²ó¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤Î¸Æ½Ð¤·¤ò´Þ¤à¤³¤È¤Ë¤Ê¤ë¡£ ¤³¤Î¥Æ¥¹¥È¤Ë¤ª¤¤¤Æ¤Ï¡¢Âбþ¤¹¤ë¼ê½ñ¤­¤Î´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤ÈÈæ³Ó¤·¤Æ¡¢ BLL ¤Î¼°¤Ï¾¯¤·ÃÙ¤¤¡£(Âç¤Þ¤«¤Ë¸À¤Ã¤ÆÊ¿¶Ñ¤Ç 10%¡¢ºÇÂç¤Ç 14% ¤Û¤É) ½¾Íè¤Î STL ¤Î¼°¤Ç¤Ï¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ÎÄã²¼¤Ï¤â¤¦¾¯¤·Â礭¤¤¡£ °ìÈÖñ½ã¤Ê¼°¤Ç¤Ï 27% ¤Û¤É¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£

¤³¤ì¤é¤Î¥Æ¥¹¥È¤«¤é¡¢BLL ¤Ï STL ¤Î´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤ÈÈæ³Ó¤·¤Æ ¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ÎÄã²¼¤ò¾·¤¤¤Æ¤Ï¤¤¤Ê¤¤¡£ ŬÅö¤ÊºÇŬ²½¥³¥ó¥Ñ¥¤¥é¤ò»ÈÍѤ¹¤ì¤Ð¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ÎÆÃÀ­¤Ï¡¢ ½¾Íè¤Î STL ¤ò»È¤Ã¤¿¤â¤Î¤ËɤŨ¤¹¤ë¤È»×¤ï¤ì¤ë¡£ ¤µ¤é¤Ë¡¢Ã±½ã¤Ê¼°¤Ç¤¢¤ì¤Ð¡¢ÌÀ¼¨Åª¤Ëµ­½Ò¤·¤¿´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤Î¾ì¹ç¤Î ¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Ë¶á¤¤¤È¹Í¤¨¤é¤ì¤ë¡£ ¤·¤«¤·¡¢¦Ë¥Õ¥¡¥ó¥¯¥¿¤Îɾ²Á¤Ï¡¢¥¤¥ó¥é¥¤¥óÀë¸À¤µ¤ì¤¿¾®¤µ¤Ê´Ø¿ô¤Î¸Æ½Ð¤·¤Î Ϣ³¤Ç¤¢¤ë¤¿¤á¡¢¥³¥ó¥Ñ¥¤¥é¤¬¤½¤ì¤é¤Î¥¤¥ó¥é¥¤¥óŸ³«¤Ë¼ºÇÔ¤¹¤ë¤È¡¢ ¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ÏÄã²¼¤¹¤ë¤À¤í¤¦¡£ ¤³¤¦¤Ê¤Ã¤¿¾ì¹ç¡¢¼Â¹Ô»þ´Ö¤ÏÆóÇܰʾå¤Ë¤Ê¤ë¤«¤â¤·¤ì¤Ê¤¤¡£ ¾åµ­¤Î¥Æ¥¹¥È¤Ï¤³¤Î¤è¤¦¤Ê¤³¤È¤¬È¯À¸¤¹¤ë¼°¤ò´Þ¤ó¤Ç¤¤¤Ê¤¤¤¬¡¢ °ì¸«¤¹¤ë¤Èñ½ã¤Ê¼°¤Ç¡¢¤³¤Î¤è¤¦¤Ë¤Ê¤Ã¤¿¤³¤È¤â¤¢¤ë¡£

Table 3. Test 1. ¦Ë¼°¤Çµ­½Ò¤·¤¿À°¿ô¤Î¾è»»¤È ½¾Íè¤Î¼ê½ñ¤­¤Î´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¥¯¥é¥¹¤Çµ­½Ò¤·¤¿À°¿ô¤Î¾è»» ¤Î CPU »þ´Ö¤ÎÈæ³Ó¡£ ¼Â¹Ô»þ´Ö¤Îñ°Ì¤Ï×ó°ÕŪ¤Ç¤¢¤ë¡£

expressionlambda expressionhand-coded function object
x240230
x*x340350
x*x*x770760
x*x*x*x11801210
x*x*x*x*x19501910

Table 4. Test 2. ¦Ë¼°¤Çµ­½Ò¤·¤¿»»½Ñ¼°¤È¡¢ compose2 ¤ä bind1st ¤Ê¤É¤ò»ÈÍѤ·¤¿½¾Íè¤Î STL ¤Î̵̾´Ø¿ô¤Çµ­½Ò¤·¤¿»»½Ñ¼°¤È¡¢ ½¾Íè¤Î¼ê½ñ¤­¤Î´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¥¯¥é¥¹¤Çµ­½Ò¤·¤¿»»½Ñ¼°¤Î CPU »þ´Ö¤ÎÈæ³Ó¡£ BLL ¤Î¸ÀÍÕ¤ò»ÈÍѤ¹¤ì¤Ð¡¢ a ¤È b ¤Ï¼°¤Î«ÇûÊÑ¿ô¤Ç¤¢¤ê¡¢x ¤Ï¼«Í³ÊÑ¿ô¤Ç¤¢¤ë¡£ Á´¤Æ¤ÎÊÑ¿ô¤Ï double ·¿¤Ç¤¢¤ë¡£ ¼Â¹Ô»þ´Ö¤Îñ°Ì¤Ï×ó°ÕŪ¤Ç¤¢¤ë¡£

expressionlambda expressionclassic STL expressionhand-coded function object
ax330370290
-ax350370310
ax-(a+x)470500420
(ax-(a+x))(a+x)620670600
((ax) - (a+x))(bx - (b+x))(ax - (b+x))(bx - (a+x))166016601460

½é´ü¤Î¥é¥¤¥Ö¥é¥ê¤ò»ÈÍѤ·¤¿¹¹¤Ê¤ë¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Î¥Æ¥¹¥È¤Ï¡¢ [Jär00] ¤Ëµ­½Ò¤·¤Æ¤¢¤ë¡£

7.2. About compiling

BLL ¤ÏƱ¤¸¥Æ¥ó¥×¥ì¡¼¥È¤Î¿ô¿¤¯¤ÎºÆµ¢Åª¤Ê¥¤¥ó¥¹¥¿¥ó¥¹²½¤ò¹Ô¤¦¤¿¤á¡¢ ¥Æ¥ó¥×¥ì¡¼¥È¤òÈó¾ï¤ËÂçÎ̤˻ÈÍѤ·¤Æ¤¤¤ë¡£ ¤³¤Î¤³¤È¤Ï(¾¯¤Ê¤¯¤È¤â)¼¡¤Î»°¤Ä¤Î¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤ë¡£

  • Èó¾ï¤ËÊ£»¨¤Ê¦Ë¼°¤ò½ñ¤¯¤³¤È¤¬¤Ç¤­¤Æ¤â¡¢ ¶²¤é¤¯¤½¤ì¤Ï¤¤¤¤¹Í¤¨¤Ç¤Ï¤Ê¤¤¡£ ¤½¤Î¤è¤¦¤Ê¦Ë¼°¤Î¥³¥ó¥Ñ¥¤¥ë¤Ë¤Ï¤¿¤¯¤µ¤ó¤Î¥á¥â¥ê¤òɬÍפȤ·¡¢ ¥³¥ó¥Ñ¥¤¥ë¤¬ÃÙ¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¦¤«¤â¤·¤ì¤Ê¤¤¡£

  • Î㤨ñ½ã¤Ê¦Ë¼°¤«¤éÀ¸À®¤µ¤ì¤¿¤È¤·¤Æ¤â¡¢¦Ë¥Õ¥¡¥ó¥¯¥¿¤Î·¿¤ÏÉԲIJò¤Ç¤¢¤ë¡£ Ä̾ï¥×¥í¥°¥é¥Þ¤Ï¦Ë¥Õ¥¡¥ó¥¯¥¿¤½¤Î¤â¤Î¤Î·¿¤ò°·¤¦É¬ÍפÏÁ´¤¯¤Ê¤¤¡£ ¤·¤«¤·¡¢¦Ë¼°Ãæ¤Ç¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¤Ï¡¢ Ä̾拾¥ó¥Ñ¥¤¥é¤Ï´Ø·¸¤¹¤ë¦Ë¥Õ¥¡¥ó¥¯¥¿¤Î·¿¤ò½ÐÎϤ¹¤ë¡£ ÆÃ¤Ë¡¢¥³¥ó¥Ñ¥¤¥é¤¬°ìÏ¢¤Î¥Æ¥ó¥×¥ì¡¼¥È¤Î¥¤¥ó¥¹¥¿¥ó¥¹²½¤ÎÁ´¤Æ¤ò½ÐÎϤ¹¤ë¤È¡¢ ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤ÏÈó¾ï¤ËŤ¯¤Ê¤ê¡¢°ÕÌ£¤òÍý²ò¤¹¤ë¤³¤È¤¬Æñ¤·¤¯¤Ê¤ë¡£

  • C++ ɸ½à¤Ç¤Ï¡¢Ìµ¸ÂºÆµ¢¤Î¸¡½Ð¤Î¤¿¤á¤Ë¡¢ ¥Æ¥ó¥×¥ì¡¼¥È¤Î¥Í¥¹¥È¤Ï 17 ³¬ÁؤޤǤÈÄ󰯤µ¤ì¤Æ¤¤¤ë¡£ Ê£»¨¤Ê¦Ë¥Æ¥ó¥×¥ì¡¼¥È¤Ï´Êñ¤Ë¤³¤ÎÀ©¸Â¤ò±Û¤¨¤Æ¤·¤Þ¤¦¡£ ¿¤¯¤Î¥³¥ó¥Ñ¥¤¥é¤Ï¤è¤ê¿¼¤¤¥Æ¥ó¥×¥ì¡¼¥È¤Î¥Í¥¹¥È¤òµö¤·¤Æ¤¤¤ë¤¬¡¢ °ìÈÌŪ¤Ë¤Ï¡¢ÌÀ¼¨Åª¤ËÀ©¸Â¤ò¾å¤²¤ë¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤òɬÍפȤ¹¤ë¡£

7.3. Portability

BLL ¤Ï°Ê²¼¤Î¥³¥ó¥Ñ¥¤¥é¤Çưºî¤¹¤ë¡£ ¤Ä¤Þ¤ê¡¢¤³¤ì¤é¤Î¥³¥ó¥Ñ¥¤¥é¤Ï BLL ¤ò´Þ¤ó¤À¥Æ¥¹¥È¥±¡¼¥¹¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£

  • GCC 3.0.4
  • KCC 4.0f with EDG 2.43.1
  • GCC 2.96 (exception_test.cpp ¤Î¤ß¥³¥ó¥Ñ¥¤¥é¤ÎÆâÉô¥¨¥é¡¼¤Ë¤è¤ê¼ºÇÔ¤¹¤ë)

7.3.1. Test coverage

°Ê²¼¤Î¥ê¥¹¥È¤Ï´Þ¤Þ¤ì¤Æ¤¤¤ë¥Æ¥¹¥È¥Õ¥¡¥¤¥ë¤È¡¢ ¤½¤ì¤¾¤ì¤Î¥Õ¥¡¥¤¥ë¤¬ÂоݤȤ¹¤ëÆÃÀ­¤ò¼¨¤·¤Æ¤¤¤ë¡£

  • bind_tests_simple.cpp : °Û¤Ê¤ë°ú¿ô¤Î¿ô¤È¡¢Âоݤδؿô¤Î°Û¤Ê¤ë·ÁÂÖ (´Ø¿ô¥Ý¥¤¥ó¥¿¡¢´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¡¢¥á¥ó¥Ð´Ø¿ô)¤ËÂФ¹¤ë bind ¼°¡£ bind ¼°¤Ë¤è¤ë´Ø¿ô¤Î¹çÀ®¡£

  • bind_tests_simple_function_references.cpp : bind_tests_simple.cpp ¤ÎÃæ¤Î¡¢Âоݤδؿô¤¬´Ø¿ô¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¤È¤³¤í¤ò¡¢ Âå¤ï¤ê¤Ë´Ø¿ô¤Ø¤Î»²¾È¤ò»È¤Ã¤Æ¡¢Á´¤Æ¤Î¥Æ¥¹¥È¤ò·«¤êÊÖ¤¹¡£ bind_tests_simple.cpp ¤ÎÁ´¤Æ¤Î¥Æ¥¹¥È¤ò·«¤êÊÖ¤¹¡£

  • bind_tests_advanced.cpp : ¥Í¥¹¥È¤·¤¿ bind ¼°¡¢unlambda¡¢protect¡¢ const_parameters¡¢break_const ¤Î¥Æ¥¹¥È¤ò´Þ¤à¡£ ¦Ë¥Õ¥¡¥ó¥¯¥¿¤ò¼Â°ú¿ô¤È¤·¤ÆÂ¾¤Î¦Ë¥Õ¥¡¥ó¥¯¥¿¤ËÅϤ·¡¢¥«¥ê¡¼²½¤·¡¢ ´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤ÎÊÖ¤êÃͤη¿¤ò»ØÄꤹ¤ë¤¿¤á¤Ë¡¢¥Æ¥ó¥×¥ì¡¼¥È sig ¤ò»ÈÍѤ¹¤ë¥Æ¥¹¥È

  • operator_tests_simple.cpp : ñ¹à¡¢Æó¹à¤Î»»½Ñ±é»»¡¢ ¥Ó¥Ã¥È±é»»¡¢ Èæ³Ó¡¢ ÏÀÍý±é»»¡¢ ¥¤¥ó¥¯¥ê¥á¥ó¥È¡¢¥Ç¥¯¥ê¥á¥ó¥È¡¢ ¹çÀ®¡¢ ÂåÆþ¡¢ ÇÛÎóź»ú¡¢ ¥¢¥É¥ì¥¹±é»»¡¢ »²¾È¤Ï¤¬¤·¡¢ ¥³¥ó¥Þ±é»»»Ò ¤È¤¤¤¦¦Ë¼°¤Î¤¿¤á¤Ë¥ª¡¼¥Ð¡¼¥í¡¼¥É¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î±é»»»Ò¤ò»È¤¦¥Æ¥¹¥È¡£ ¥·¥Õ¥È±é»»»Ò¤Ç¤Î¥¹¥È¥ê¡¼¥ß¥ó¥°¡¢²Ã»»¸º»»±é»»»Ò¤Ç¤Î¥Ý¥¤¥ó¥¿»»½Ñ¤Î¥Æ¥¹¥È ¤â¹Ô¤ï¤ì¤ë¡£

  • member_pointer_test.cpp : ¥á¥ó¥Ð¤Î±é»»»Ò¤Ø¤Î¥Ý¥¤¥ó¥¿¤ÏÈó¾ï¤ËÊ£»¨¤Ê¤Î¤Ç¡¢¥Æ¥¹¥È¥Õ¥¡¥¤¥ë¤òÊ̤ˤ·¤¿¡£

  • control_structures.cpp : ¥ë¡¼¥×¤È if ʸ¤Î¹½Â¤¤Î¥Æ¥¹¥È¡£

  • switch_construct.cpp : Á´¤Æ¤Î¥µ¥Ý¡¼¥È¤¹¤ë switch ʸ ¤Î°ú¿ô¤Î¿ô¤È default ¤Î¾ì¹ç¤¬¤¢¤ë¤«¤É¤¦¤«¤Î¥Æ¥¹¥È¤ò´Þ¤à¡£

  • exception_test.cpp : catch ¥Ö¥í¥Ã¥¯¤Î¿ô¤òÊѲ½¤µ¤»¤Ê¤¬¤é¡¢ try/catch ¤Î¤¿¤á¤ÎÎã³°¤òÁ÷½Ð¤¹¤ë¥Æ¥¹¥È¤ò´Þ¤à¡£

  • constructor_tests.cpp : constructor¡¢destructor¡¢new_ptr¡¢ delete_ptr¡¢new_array¡¢delete_array ¤ËÂФ¹¤ë¥Æ¥¹¥È¤ò´Þ¤à¡£

  • cast_test.cpp : »Í¤Ä¤Î¥­¥ã¥¹¥È¼°¤Î¥Æ¥¹¥È¡£typeid ¤È sizeof ¤Î¥Æ¥¹¥È¤â´Þ¤à¡£

  • extending_return_type_traits.cpp : ¥æ¡¼¥¶ÄêµÁ·¿¤Î¤¿¤á¤ÎÊÖ¤êÃͤη¿¿äÏÀ¥·¥¹¥Æ¥à¤Î³ÈÄ¥¤Î¥Æ¥¹¥È¡£ ¤¤¤¯¤Ä¤«¤Î¥æ¡¼¥¶ÄêµÁ¤Î±é»»»Ò¤È¡¢ ¤½¤ì¤ËÂбþ¤¹¤ëÆÃ¼ì²½¤Î¤¿¤á¤ÎÊÖ¤êÃͤη¿¿äÏÀ¥Æ¥ó¥×¥ì¡¼¥È¤ò´Þ¤à¡£

  • is_instance_of_test.cpp : ÆâÉôŪ¤Ë»ÈÍѤµ¤ì¤ëÆÃÀ­¥Æ¥ó¥×¥ì¡¼¥È¤Î¤¿¤á¤Î¥Æ¥¹¥È¤ò´Þ¤à¡£ ¤³¤ÎÆÃÀ­¥Æ¥ó¥×¥ì¡¼¥È¤Ï¡¢Í¿¤¨¤é¤ì¤¿·¿¤¬¤¢¤ë¥Æ¥ó¥×¥ì¡¼¥È¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤«¤É¤¦¤«¤ò¸¡½Ð¤¹¤ë¡£

  • bll_and_function.cpp : ¦Ë¥Õ¥¡¥ó¥¯¥¿¤È boost::function ¤ò°ì½ï¤Ë¤·¤è¤¦¤¹¤ë¥Æ¥¹¥È¤ò´Þ¤à¡£