add files
[leishi.git] / draft / en / note / xfdtd_pic / Techniques_scientic_cpp.org
blobfd1e227bc3f2f1b3c767893144032ce2d286e93d
1 #author Todd Veldhuizen,ʯÀÚ
2 #date   Aug,2000
3 #desc 
4 #title  C++¿Æѧ¼ÆËã¼¼ÇÉ( Techniques of scientic C++)
6 * <lisp>(setq  Title "C++¿Æѧ¼ÆËã¼¼ÇÉ")</lisp>
7  - ×÷Õß:[[mailto:tveldhui@acm.org][ Todd Veldhuizen]]
8  - ·­Òë: [[http://stoneszone.net][ʯÀÚ]]
9  - ³ö´¦: Indiana University Computer science Technical Report #542 Version 0.4,August 2000
10  - °æȨ: ×ªÔØÇë×¢Ã÷³ö´¦
11 <contents depth="4">
13 ** µÚÒ»ÕÂ
14 *** 1.1 C++ ±àÒëÆ÷
15 ****  1.1.1 °²¸§×Ó±ê×¼µÄ±àÒëÆ÷
16   ËùÓеÄC++±àÒëÆ÷½öÖ§³ÖISO/ANSI C++±ê×¼µÄ²»Í¬×Ó¼¯¡£ÊÔͼÌṩ¿ÉÒÔÔËÐÐÔÚ²»Í¬Æ½Ì¨ÉϵÄC++¿â»ò³ÌÐòÊÇÒ»¸öÈÃÈËÍ·ÌÛµÄÊÂÇé¡£
18   ±àÒëÆ÷ÖÐ×î´óµÄ¼æÈÝÐÔÎÊÌâÊÇ
19   1. Template
20   2. STL
21   
22    Èç¹ûÄãÐèҪд¿ÉÒÔÔÚ²»Í¬Æ½Ì¨Ï¹¤×÷µÄ´úÂ룬´ó²¿·Öʱ¼äÄã»áÔڼ尾Öжȹý¡£ÔÚBlitz++¿âÖУ¬ÎÒ²ÉÓÃÁËÀ©Õ¹µÄÔ¤´¦ÀíKludgesÀ´½â¾ö²»Í¬µÄ±àÒëÆ÷¡£ÀýÈçÏÂÃæÕâ¶Î´úÂë:
24 <source lang="C">
25 #include <cmath>
27 namespace blitz{
28     double pow(double x,double y)
29     {return std::pow(x,y);}
31 </source>
33   Õâ¶Î¼òµ¥µÄ´úÂëÔÚBlitz namespace(Ãû×Ö¿Õ¼ä)Öж¨ÒåÁËÒ»¸öº¯Êýpow,Ëüµ÷ÓÃÁ˱ê×¼µÄpowº¯Êý¡£Ò»Ð©±àÒëÆ÷²»Ö§³Ö<cmath>Í·Îļþ£¬ËùÒÔÐèÒªÌ滻Ϊ<math.h>¡£Ò»Ð©±àÒëÆ÷Ö§³Ö£¬µ«ÊÇC mathº¯Êý²»ÔÚstdµÄnamespaceÖС£ÉõÖÁһЩ±àÒëÆ÷¸ù±¾¾Í²»Ö§³Önamespace¡£ÎÒʹÓõĽâ¾ö·½°¸ÈçÏÂ:
35 <source lang="C">
36 #ifdef BZ_MATH_FN_IN_NAMESPACE_STD
37   #include <cmath>
38 #else
39   #include <math.h>
40 #endif
42 #ifdef BZ_NAMESPACES
43 double pow(double x,double y)
45   return BZ_MATHFN_SCOPE(pow)(x,y);
47 #endif
48 </source>
50   ÕâÖÖ½â¾ö·½·¨ºÜÄÑ¿´¡£²»ÐÒµÄÊÇ£¬ÕâÖÖÇéÐÎÈÔ»á³ÖÐøºÜ¶àÄֱ꣬µ½ËùÓеıàÒëÆ÷¶¼Âú×ã±ê×¼¡£
52   Blitz++×Ô´øÓÐÒ»¸ö½Å±¾(bzconfig),Ëü»áÔËÐÐÐí¶àСµÄ²âÊÔ³ÌÐòÀ´Õì²â³öµ±Ç°µÄ±àÒëÆ÷ÐèҪʲôÑùµÄkludges¡£[[mailto::Luc.Maisonobe@cnes.fr][Luc Maisonobe]]ÒѾ­½«ÕâЩ³ÌÐò¼ÓÈëÁËAutoconf¹¤¾ßÖС£ÄãÒ²¿ÉÒÔÐÞ¸ÄBlitz++ÖеÄbzconfig½Å±¾À´Ê¹ÓÃËü¡£
54   ÁíÒ»ÖÖ·½·¨À´±ÜÃâ¶à¸öƽ̨֧³ÖµÄ·½·¨Ê±½öÖ§³Ögcc±àÒëÆ÷¡£ÒòΪËüÔÚÖ§³Ö±ê×¼·½ÃæÒªºÃ¹ýºÜ¶à±àÒëÆ÷£¬²¢ÇÒÔÚ±ê×¼¿âʵÏÖÉÏÓнϸߵÄÌáÉý¡£¿ÉÊÇËüÔÚÓÅ»¯ÉÏûÓÐKAI c++±àÒëÆ÷ºÍһЩÌض¨³§É̵ıàÒëÆ÷Ç¿¡£µ«¶ÔÓÚ´óÐ͵Äout-of-cache³ÌÐò£¬gcc×öµÄºÜºÃ¡£(Out-out-cache ³ÌÐò¶ÔÓÚÓÅ»¯²»Ãô¸Ð£¬ÒòΪ´ó¶àÊýµÄcpuʱ¼äÓÃÔÚÁËÄÚ´æÉÏ(Stalling for memory).
56 **** 1.1.2 ±àÒëÆ÷Ò»ÀÀ
57   ¶àÊýµÄc++±àÒëÆ÷ʹÓÃÓÉEDG(Edison Design Group)дµÄÇ°¶Ë¡£Õâ¸öÇ°¶ËÊÇÒ»¸öºÜ½Ó½ü±ê×¼£¬½¡×³¿É¿¿£¬¿ÉÒÔÌṩºÜÓÐÒâÒåµÄ´íÎóÐÅÏ¢¡£Äã¿ÉÒÔÔÚÈκÎƽ̨ÉÏÕÒµ½EDGµÄÉíÓ°¡£ÆäÖеÄһЩÊÇ:SGI C++,KAI C++,DEC cxx,Gray C++,Intel C++,Portland Group C++,Tera C++¡£
59   ´ó²¿·ÖµÄc++±àÒëÆ÷(Borland/Inprise,Microsoft,etc)²»·ûºÏ±ê×¼µÄ³Ì¶ÈÁîÈ˾ªÑÈ¡£ËüÃǶ¼¹Ø×¢ÔÚCOM,DCOM,WFCµÈÉÏ¡£Ò»µã¶¼²»¹ØÐıê×¼µÄÖ§³Ö¡£Microsoft's 6.0 C++±àÒëÆ÷ÔÚ±àÒë¼òµ¥µÄ³ÉԱģ°æʱ¶¼»á¾­³£µÄ±ÀÀ£¡£ÔÚºÍMicrosoft¿ª·¢ÈËÔ±¶Ô»°µÄ¹ý³ÌÖУ¬ËûÃÇ˵ÕâÊÇÒòΪËûÃǵĿͻ§²»»á¹ØÐÄÊÇ·ñ·ûºÏ±ê×¼£¬¶øÊÇÔÚ¹ØÐÄһЩWFC/COMµÈ¶«Î÷¡£Ò²ÐíÕâÊǶԵġ£µ«ÊÇÈç¹ûÄãÔÚ×Ô¼º×îϲ»¶µÄ±àÒëÆ÷ÉÏÓÉÓÚ±ê×¼ÎÊÌâ¶øÊܴ죬ÄǾÍÒò¸ÃÏò¿ª·¢ÉÌͶËߣ¬·ñÔòËûÃÇÊDz»»á¿¼ÂÇÕâЩµÄ¡£
62 **** 1.1.3 Ìض¨µÄC++ÓÅ»¯
63   ´ó²¿·ÖµÄ±àÒëÆ÷ÔÚÓÅ»¯C++³ÌÐòÉÏÁîÈËʧÍû¡£¶ÔÓÚÔÚc++Öо­³£³öÏÖµÄǶÌ׵ľۼ¯ºÍÁãʱ±äÁ¿£¬³£¹æµÄÓÅ»¯¼¼ÇÉÐèÒªÐ޸ġ£µ«ÊÇKAI±àÒëÆ÷ÊÇÒ»¸öÀýÍ⣬ËüµÄÓÅ»¯×öµÄºÜºÃ¡£ÁíÍâÒ»¸öÊÇSGI±àÒëÆ÷(ËäÈ»¶ÔÓÚKAI£¬Ä¿Ç°ÔÚÁãʱ±äÁ¿Ïû³ýÉÏ»¹×öµÄ²»¹»ºÃ)
65   KAIÔÚÓÅ»¯¼¼ÊõÉÏÓÐÃÀ¹úרÀû£¬µ¼ÖÂÆäËû³§É̲»ÄÜʵÏÖÏàͬµÄÓÅ»¯¼¼Êõ¡£¾¡¹ÜÈç´Ë£¬Ëü»¹ÊǸøEPC++±àÒëÆ÷ÌṩÁËÓÅ»¯ÒýÇæµÄʹÓÃÐí¿ÉÖ¤¡£
67 *** 1.2 ±àÒëʱ¼ä
68   ¶ÔBlitz++±§Ô¹×î¶àµÄÊDZàÒëʱ¼ä¹ý³¤(ÒÔ¼°ÆäËûµÄtemplate C++ ¿â)¡£ÏÂÃæС½Ú½«½éÉÜΪºÎC++³ÌÐòÐèÒªÕâô³¤µÄʱ¼ä±àÒë¡£
70 **** 1.2.1 Í·Îļþ
71   Í·ÎļþÊÇÒ»¸ö´óÎÊÌâ¡£C++ûÓÐÒ»¸öºÜÓÐЧµÄÄ£¿éϵͳ¡£µ¼Ö´óÁ¿µÄÍ·ÎļþÔÚÿһ¸ö±àÒëÄ£¿é¶¼ÐèÒª±»½âÎöºÍ·ÖÎö¡£ÀýÈ磬 °üÀ¨<iostream>ÔÚÓÐЩ±àÒëÆ÷ÉÏ»áÀ­Èë³ÉǧÉÏÍòÐеĴúÂë¡£
73   Template ¿âµÄÇé¿ö¸ü¼ÓÑÏÖØ¡£ÒòΪËùÓеÄÄ£°æ¾ÛÏÖ¶¼ÔÚ±àÒëÆÚ½øÐС£ËùÒÔ³ýÁ˺¯ÊýÉùÃ÷£¬Í·Îļþ»¹°üÀ¨Á˺¯Êý¶¨Òå¡£
75   ÀýÈ磬ÔÚÎÒµÄ×ÀÃ湤×÷Õ¾ÓÃgcc±àÒëBlitz++µÄ example/array.cppÀý×ÓÐèÒª37Ãë¡£Èç¹ûÄã³ýÈ¥ÆäÖÐËùÓеĴúÂ룬ֻÁôÏÂ#include<blitz/array.h>ÕâÒ»ÐУ¬±àÒ뾹Ȼ»¹ÐèÒª22Ãë¡£Ò²¾ÍÊÇÊÇ˵£¬60%µÄʱ¼ä¶¼±»ÓÃÀ´±àÒëÍ·ÎļþÁË£¡
77   Ô¤ÏȱàÒëÍ·Îļþ¼¼Êõ¿ÉÒÔÔÚÒ»¶¨³Ì¶ÈÉÏ»º½âÕâ¸öÎÊÌ⣬µ«ÊÇÓÐʱºòËûÃÇÒ²»áÈÃÎÊÌâ¸ü¼ÓÑÏÖØ¡£ÔÚBlitz++ÖпªÆôPrecompiled Header¿ÉÒÔ²úÉú´óÔ¼64MbµÄdumps,¶ÁÈ¡Ëü»á±ÈËüÈ¡´úµÄÔ­Í·Îļþ»ª¸ü¶àµÄʱ¼ä¡£
78   
79   ±¾½Ú¸æËßÄãÒª¾¡Á¿±£³ÖÄãµÄHeaderԽСԽºÃ¡£µ±¿ª·¢Ò»¸ö¿âʱ£¬ÌṩºÜ¶à¸öСµÄÍ·ÎļþÀ´ÔÚÏàÓ¦µÄÇé¿öÏ·ֱð°üº¬£¬¶ø²»Ó¦¸Ã½ö½öÌṩһ¸ö°üº¬ËùÓгÌÐò¿âµÄ³¬´óÍ·Îļþ¡£
81 **** 1.2.2 Prelinking
82   Ä£°æ¸ø±àÒëÆ÷µ¼ÖÂÁËÒ»¸öÑÏÖصÄÎÊÌ⡣ʲôʱºòËûÃDzÅÐèÒª±»¾ÛÏÖ»¯£¿Õâͨ³£ÓÐÁ½ÖÖ·½Ê½:
84  - ¶ÔÓÚÿһ¸ö±àÒëÄ£¿é£¬Éù³ÆËùÓÐÐèÒªµÄÄ£°æʵÀý¡£Õâµ¼Ö¶àÖØÄ£°æʵÀý-Èç¹ûfoo1.cppºÍfoo2.cpp¶¼Ê¹ÓÃÁË list<int>, ÄãµÃµ½ÁËÁ½¸ölist<int>µÄʵÀý-Ò»¸öÔÚfoo1.oÖУ¬ÁíÒ»¸öÔÚfoo2.oÖС£Ò»Ð©Á¬½ÓÆ÷»á×Ô¶¯µÄÅ×ÆúÖظ´µÄʵÀý¡£
85  - ²»×öÈκξÛÏÖ»¯¡£¶øÔÚÁ¬½ÓʱÆÚÀ´È·¶¨Ê²Ã´Ä£°æÐèÒª¾ÛÏÖ£¬È»ºó»Øµ½±àÒëÈ¥Éú³ÉËüÃÇ¡£Õâ¾Í½Ð×öPrelinking
87   ²»ÐÒµÄÊÇprelinkingÐèÒªprelinkingÄãµÄÕû¸ö³ÌÐòºÜ¶à´Î¡£
88   
89   Ò»¸öÄ£¿é±»Öظ´±àÒëÈý´ÎºÜ³£¼û¡£Äã¿ÉÒÔÏëÏ󣬶ÔÓÚÒ»¸ö´óÐ͵ijÌÐòÕ⽫ºÄ·Ñ¶àÉÙ±àÒëʱ¼ä¡£
91   ²ÉÓÃEDGÇ°¶ËµÄ±àÒëÆ÷¿ÉÒÔÇ¿ÖƲ»×öprelinking,ͨ¹ýoption -tused »òÕß-ptusedʵÏÖ¡£
93 **** 1.2.3 ³ÌÐòÊý¾Ý¿â·½·¨-visual age c++
95  IBMµÄVisual Age C++ ±àÒëÆ÷¶ÔÓÚ·Ö±ð±àÒëÓÐÒ»¸öÓÐȤµÄ¼¼Êõ¡£Ëü°ÑËùÓеĴúÂë±£´æÔÚÒ»¸öÊý¾Ý¿âÖС£ÓÉÓÚÍêÕûµÄÔ´´úÂ붼ÊÇ¿ÉÒÔÔÚ±àÒëÆÚ¼äÈ¡µÃµÄ(¶ø²»Êǽö½öÒ»¸ö±àÒëµ¥ÔªµÄ´úÂë)£¬VAC++ ²»ÐèÒª×öprelinking»òÕßµ£ÐÄ·Ö±ð±àÒëÎÊÌâ¡£±àÒëÆ÷×öÔöÁ¿±àÒ룬µ«ÊǽöÕë¶Ô´úÂë¸Ä±äµÄÇé¿ö¡£ÕâÖÖ¼¼Êõ¿ÉÒÔ´ó·ù¶ÈµÄ½µµÍ±àÒëtemplate c++ ¿âµÄʱ¼ä¡£
97   
98 **** 1.2.4 ¶þ´Î/Èý´Î Ä£°æËã·¨
99   ÏñBlitz++µÄ¿âʹÓÃÁË´óÁ¿µÄtemplate¡£Ò»Ð©±àÒëÆ÷ÔÚÄ£°æ¾ÛÏÖÉÏÓÐ×Ô¼ºµÄËã·¨£¬µ«ÊÊÓ¦ÐÔ²»ÊǺܺá£ÀýÈçÏÂÃæµÄ´úÂë:
101 <source lang="C">
102 template<int N>
103 void foo()
105   for<N-1>();
108 template<>
109 void foo<0>()
112 </source>
114   Èç¹û¾ÛÏÖfoo<N>,ÄÇôfoo<N-1>±»¾ÛÏÖ£¬Í¬Ñùfoo<N-1>,...,Ö±µ½foo<0>¡£±àÒëÐèÒª¶àÉÙʱ¼ä£¿¾ÛÏֵĺ¯Êý¸öÊýÊÇN¸ö£¬ËùÒÔ±àÒëʱ¼äÓ¦¸ÃËæNÏßÐÔÔö³¤£¬¶ÔÂð£¿
116   ²»ÐÒµÄÊǶÔһЩ±àÒëÆ÷²¢²»ÊÇÕâÑù¡£¼òµ¥µÄ˵£¬Ðí¶à±àÒëÆ÷×ÔÉí±£´æÒ»¸öÁ´±í£¬È·¶¨Ò»¸ötemplateÊÇ·ñ±»¾ÛÏÖ¹ýÐèÒªÏßÐÔËÑË÷¡£ËùÒÔ±àÒëʱ¼äΪO(N^2).Õâ¶ÔÓÚºÜÉÙµÄtemplateµÄ³ÌÐò²»³ÉÎÊÌ⣬µ«¶ÔÓÚÏñBlitz++ÄÇÑùÓÐÉÏǧ¸ötemplateÐèÒª¾ÛÏֵijÌÐò¿â¾ÍºÜÖÂÃü¡£
118    Í¬ÑùµÄÎÊÌâ¿ÉÒÔ·¢ÉúÔÚÓÅ»¯Ëã·¨ÉÏ¡£±ÈÈç±ðÃû¼ì²é¡£ÎÒÔÚһЩÖ÷Á÷C++±àÒëÆ÷ÉÏ·¢ÏÖÁËO(N^2),O(N^3)µÄÓÅ»¯Ëã·¨¡£
120 *** 1.3 ¾²Ì¬¶à̬
121 **** 1.3.1 Ð麯ÊýÊÇа¶ñµÄÂð£¿
122   ÔÚC++µÄÊÀ½çÀ¶à̬Òâζ×ÅÐ麯Êý¡£ÕâÖÖ¶à̬ÊǺÜÓÐ×÷ÓõÄÉè¼Æ·½·¨¡£µ«ÊÇʹÓÃÐ麯Êý»áÓдóµÄÐÔÄÜËðʧ¡£
124  - ¶àÓàµÄÄÚ´æ´æÈ¡
125  - Ð麯Êý·ÖÅÉ¿ÉÒÔµ¼Ö²»¿ÉÔ¤ÁϵÄÖ´ÐзÖÖ§-Á÷Ë®Ïß×÷Òµ»áÍ£Ö¹(ÔÚһЩƽ̨ÉÏÓÎbranch cache£¬¿ÉÒÔ±ÜÃâÕâÖÖÎÊÌâ)
126  - Ä¿Ç°µÄC++ ±àÒëÆ÷²»ÄÜÓÅ»¯Ð麯Êýµ÷ÓÃ: Ëü×èÖ¹ÁËÖ¸Áîscheduling,Êý¾ÝÁ÷·ÖÎö£¬Ñ­»·Õ¹¿ªµÈ¡£
128   Ä¿Ç°Ò»Ð©Ñо¿ÏîÄ¿ÒѾ­³É¹¦ÔËÓÃÁËÌæ»»Ð麯ÊýµÄ·½·¨£¬³ÆΪֱ½Ó·Ö·¢(direct dispatch)¡£µ«ÊÇÕâÖÖ·½·¨»¹Ã»ÓÐÔÚÈκαàÒëÆ÷ÉÏʵÏÖ¡£Ò»¸öÕÏ°­ÊÇÈ¥³ýÐéÄ⺯Êý·ÖÅÉÐèÒª¶ÔÈ«²¿³ÌÐò½øÐзÖÎö-Äã±ØÐëÓÐÕû¸ö³ÌÐò²ÅÄÜÔÚ±àÒëʱ¼ä·ÖÎö¡£¼¸ºõËùÓеÄC++ʵÏÖ¶¼¶Ô±àÒëÄ£¿é½øÐзֱðµÄµ¥¶À±àÒë-ΨһµÄÀýÍâÊÇVisual Age C++¡£
130   ±ØÐëÁ˽âµÄÊÇ£¬¾¡¹ÜÈç´Ë£¬Ð麯Êý²¢²»ÊÇÔÚÈκÎÇé¿ö¶ÔÓÚÐÔÄܶ¼ÊÇËÀÍöÖ®ÎÇ¡£×îÖØÒªµÄÊÇ£ºÓжàÉÙ´úÂëÔÚÐ麯ÊýÖУ¿Èç¹ûÓкܶàµÄ´úÂ룬ÔòÐ麯Êý¶ÔÐÔÄܵÄÓ°Ïì²»»áºÜ¿É¹Û¡£Èç¹ûºÜÉٵĻ°£¬ÔòÓ°Ïì»áºÜÑÏÖØ¡£
132   ÄÇô£¬Ê²Ã´Ê±ºòÐ麯ÊýÊDz»ÊÊÓõģ¿
134  - ÔÚÐ麯ÊýÖеĴúÂëºÜÉÙ(e.g Ð¡ÓÚ25flops)¡£
135  - Ð麯ÊýʹÓõĺÜƵ·±(e.g. ÔÚÑ­»·ÖÐ)¡£Äã¿ÉÒÔʹÓÃprofilerÀ´ÅжÏÕâµã¡£
137   Ð麯ÊýÔÚº¯Êý±È½Ï´ó(½øÐкܶàµÄ¼ÆËã)µÄʱºò¸ß¶ÈÍƼöʹÓ㬻òÕß²»Êǵ÷ÓúÜƵ·±µÄ»°¡£
139   ²»ÐÒµÄÊÇ£¬ÔÚ¿Æѧ¼ÆËã³ÌÐòÖУ¬Ò»Ð©¶ÔÓÚÐ麯Êý×îÓÐÓô¦µÄµØ·½¶¼ÔÚÑ­»·ÖУ¬²¢ÇÒÒ»°ã¶¼ÊÇСº¯Êý¡£Ò»¸ö±È½Ï¾­µäµÄÀý×ÓÈçÏ£º
141 <source lang="C">
142 class Matrix{
143   public:virtual double operator()(int i,int j)=0;
146 class SymmetricMatrix:public Matrix{
147   public:virtual double operator()(int i ,int j);
150 class UpperTriangularMatrix:public Matrix{
151   public:virtual double operator()(int i,int j);
153 </source>
155   Ð麯Êý·ÖÅÉoperator()À´´Ó¾ØÕóÖжÁÈ¡ÔªËØ£¬Õâ»áÆÆ»µÈκÎÒ»ÖÖ¾ØÕóËã·¨µÄÐÔÄÜ¡£
157 **** 1.3.2 ½â¾ö·½·¨A: ¼òµ¥ÒýÇæ(simple engines)
158   "engines"À´×ÔÔÚLANLµÄPOOMAÍŶӡ£Éè¼ÆģʽÉçÇøÒ²ÓÐÒ»¸öͬÑùµÄÃû³Æ¡£
160   Ïë·¨ÊǰѶ¯Ì¬¶à̬£¨Ð麯Êý£©Ì滻Ϊ¾²Ì¬¶à̬(template parameters)¡£ÕâÊÇÒ»¸ö²ÉÓÃÁËÕâÖÖ¼¼ÊõµÄMatrixµÄ¹Ç¼Ü¡£
162 <source lang="C">
163 class Symmetric{
164 //·â×°Õë¶Ô¶Ô³Æ¾ØÕóµÄ´æ´¢ÐÅÏ¢
167 class UpperTriangular{
168 //·â×°Õë¶ÔÈý½Ç¾ØÕóµÄ´æ´¢ÐÅÏ¢
171 tempalte<class T_engine>
172 class Matrix{
173 private:
174  T_engine engine;
177 //²ÉÓÃÈκξØÕó½á¹¹µÄº¯Êý
178 template<class T_engine>
179 double sum(Matrix<T_engine>& A);
181 //ʹÓÃÀý×Ó...
182 Matrix<Symmetric> A;
183 sum(A);
185 </source>
186   
187   ÔÚÉÏÀýÖУ¬¾ØÕó½á¹¹µÄ²»Í¬±ä»¯Òþ²ØÔÚengines SymmetricºÍUpperTriangularÖС£MatrixÀà°Ñengine×÷Ϊtemplate parameter,²¢ÇÒ°üº¬Õâ¸öengineµÄʵÀý×÷Ϊ³ÉÔ±±äÁ¿¡£
189   Óû§Ê¹ÓõķûºÅ±äÁË£ºMatrix<Symmetric> ¶ø²»ÊÇÔ­À´µÄSymmetricMatrix£¬²»¹ýÕâ¸ö²»ÊÇÒ»¸ö´óÎÊÌâ¡£ÎÒÃÇ¿ÉÒÔʹÓÃtypedefineÀ´Òþ²ØÕâ¸öϸ½Ú¡£Í¬Ñù£¬ÔÚMatrixÖУ¬´ó²¿·Ö²Ù×÷Òª±»´úÀí¸øenginesÀ´´¦Àí¡£
191   ÕâÖÖ½â¾ö·½·¨×îÑÏÖصÄÎÊÌâÊÇËùÓеÄMatrix×ÓÀàÐͶ¼±ØÐëÓÐͬÑùµÄ³ÉÔ±º¯Êý¡£ÀýÈ磬Èç¹ûÎÒÃÇÏëÒªMatrix<Symmetric>ÓÐÒ»¸öisSymmetricPositiveDefinite()µÄ·½·¨£¬µäÐ͵ÄʵÏÖÊÇ£º
193 <source lang="C">
194 template<class T_engine>
195 class Matrix{
196 public:
197   //Delegate to the engine
198   bool isSymmetricPositiveDefinite()
199   {return engine.isSymmetricPositiveDefinite();}
201 private:
202   T_engine engine;
205 class Symmetric{
206 public:
207   bool isSymmetricPositiveDefinite()
208   {
209    ...
210   }
212 </source>
213   
214   µ«ÊÇÕⲢûÓÐʹMatrix<UpperTriangular>ÓÐÀíÓÉ°üº¬isSymmetricPositiveDefinite()º¯Êý£¬ÒòΪupper triangular¾ØÕó²»ÄÜΪ¶Ô³Æ¡£´ÓÉÏÀý¿ÉÒÔ¿´³öÕâÖÖ·½·¨Ê¹»ùÀà°üº¬ÁËËùÓÐ×ÓÀàÐÍËùÓµÓеĺ¯Êý¡£ËùÒÔµ¼Ö²úÉúÁ˺ܶàÔÚengineÖлáÅ׳öÒì³£µÄ³ÉÔ±º¯Êý¡£
216 <source lang="C">
218 class UpperTriangular{
219 public:
220   bool isSymmetricPositiveDefinite()
221   {
222     throw makeError("Method isSymmetricPositiveDefinite() is not defined for UpperTriangular¾ØÕó");
223     return false;
224   }
228 </source>
230   ÁíÒ»ÖÖ·½·¨£ººöÂÔÕâЩº¯Êý¶¨Òå»á°ÑÄãµÄÓû§Íƽø»ð¿Ó¡£ÒòΪµ±Óû§ÊÔͼʹÓÃÕâЩ䶨ÒåµÄº¯ÊýµÄʱºò£¬»áµÃµ½Ò»´ó¶ÑÆæ¹ÖµÄÄ£°æ¾ÛÏÖ´íÎó¡£
232   ¿ÉϲµÄÊÇ£¬ÓÐÒ»ÖÖ¸üºÃµÄ½â¾ö·½·¨¡£
234 **** 1.3.3 ½â¾ö·½°¸B: Barton ºÍNackman ¼¼Êõ
235   ÕâÖÖ¼¼Êõ³ÆΪ"Barton and Nackman Trick",ÒòΪ ËûÃÇÔÚËûÃǵĽܳöÖø×÷<<Scientific and Engineering C++>>ÖÐʹÓÃÁËÕâÖÖ¼¼Êõ¡£GeoffÈ¡ÁËÒ»¸ö±È½ÏÓÐÒâÒåµÄÃû×Ö"Curiously Recursive Template Pattern"¡£
237   Èç¹ûÄãûÓмû¹ýÕâÖÖ¼¼ÇÉ£¬ÄÇôËüÒ»¶¨»áÈÃÄ㿪ʼץͷµÄ¡£Êǵģ¬ËüÊǺϷ¨µÄ¡£
239 <source lang="C">
241 //»ùÀàÓÐÒ»¸öÄ£°æ²ÎÊý¡£Õâ¸ö²ÎÊý¶¨ÒåÁ˸ÃÀàÓ¦¸Ã´ÓÄÄÀï¼Ì³Ð¡£
242 template<class T_leaftype>
243 class Matrix{
244 public:
245  T_leaftype& asLeaf()
246 {return static_cast<T_leaftype&>(*this);}
248 double operator()(int i,int j)
249 {return asLeaf()(i,j);} //´úÀí¸øleaf
251 }£»
253 class SymmetricMatirx : public Matrix<SymmetricMatrix>{
257 class UpperTriMatrix: public Matrix<UpperTriMatrix>{
261 // Ê¹ÓÃÀý×Ó£¬¿ÉÒÔ½ÓÊÜÈκξØÕóÀà
262 template<class T_leaftype>
263 double sum(Matrix<T_leaftype>& A);
265 //Àý×Ó
266 SymmetricMatrix A;
267 sum(A);
268 </source>
270   ÕâÖÖ¼¼Êõ¿ÉÒÔʵÏÖÒ»°ã»¯µÄ¼Ì³ÐÌåϵ½á¹¹¡£¹Ø¼üµãÔÚÓÚ»ùÀàÓÐÒ»¸öÄ£°æ²ÎÊý£¬¸Ã²ÎÊýΪºó´ú(Ò¶×Ó)ÀàµÄÀàÐÍ¡£±£Ö¤ÁËÔÚ±àÒëÆÚ¼ä¸ÃÀàÐÍÐÅÏ¢ÊÇ¿ÉÒԵõ½µÄ-²»ÔÙÐèÒªÐ麯ÊýµÄ·ÖÅÉ¡£
272   Ôڼ̳ÐÀàÖпÉÒÔÈÎÒâÑ¡ÔñÐԵĽøÐж¨ÖÆ(ÀýÈ磬»ùÀà¿ÉÒÔʵÏÖĬÈϹ¦ÄÜ£¬¼Ì³ÐÀàÖØÔØÏàÓ¦µÄ¹¦ÄÜ)
274   ÓëÉϽڽâ¾ö·½·¨²»Í¬£¬¼Ì³ÐÀà¿ÉÒÔÓÐÆäÌØÊâµÄ£¬½öÊôÓÚ×Ô¼ºµÄ(»ùÀàûÓж¨Òå)³ÉÔ±º¯Êý¡£
276   ÕâÖÖ·½·¨£¬»ùÀàÈÔȻҪ½«Ò»Çе÷ÓôúÀí¸ø¼Ì³ÐÀà¡£
278   Ê¹ÄãµÄ¼Ì³ÐÊ÷¶àÓÚÒ»²ãÊÇ¿ÉÐеģ¬µ«ÐèÒª¶à¼Ó¿¼ÂÇ¡£
280 *** 1.4 Callback inlining ¼¼Êõ
281   Callback ¾­³£»á³öÏÖÔÚ³ÌÐòÖС£Ò»Ð©µäÐ͵ÄÀý×ÓÈçÏÂ
282  - ÊýÖµ»ý·Ö:Ò»¸öÒ»°ãÐԵĻý·Ö³ÌÐòʹÓÃCallbackº¯ÊýÀ´¶ÔÐèÒª±»»ý·ÖµÄº¯ÊýÇóÖµ¡£ÔÚC¿âÖУ¬Í¨¹ý´«È뺯ÊýÖ¸ÕëµÄ²ÎÊýʵÏÖ¡£
283  - ÓÅ»¯º¯Êý
284  - ¶ÔÒ»¸öÈÝÆ÷ÖеÄËùÓбäÁ¿Ó¦ÓÃÒ»¸öº¯Êý¡£
285  - ÅÅÐòº¯Êý£¬Èçqsort()ºÍbsearch()ÐèÒªcallbackÀ´±È½Ï±äÁ¿¡£
287   ±ê×¼µÄCº¯Êý·½·¨²ÉÓú¯ÊýÖ¸ÕëÀ´ÊµÏÖCallback¡£
288 <source lang="C">
289 double integrate(double a,double b,int numSamplePoints,double(*f)(double){
290 double delta=(b-a)/numSamplePoints-1);
291 double sum = 0.0;
293 for(int i=0;i<numSamplePoints;++i)
294   sum+=f(a+i*delta);
296 return sum*(b-a)/numSamplePoints;
298 </source> 
300   ÕâÖÖ·½·¨¹¤×÷µÄºÜºÃ£¬µ«ÊǶÔÐÔÄÜÓÐÓ°Ïì:ÔÚÄÚ²¿Ñ­»·Öеĺ¯Êýµ÷ÓûᵼÖ½ϴóµÄÐÔÄÜËðʧ¡£Ò»Ð©ÓÅ»¯±àÒëÆ÷Ò²Ðí»áÖ´ÐÐinter-proceduralºÍÖ¸Õë·ÖÎöÀ´È·¶¨fÖ¸ÏòµÄÈ·Çк¯Êý£¬µ«ÊÇ´ó¶àÊý±àÒëÆ÷²»»á×ö¡£
302 **** 1.4.1 Callbacks: C++·½Ê½
303   ÔÚC++¿âÖУ¬callbacksÒ»°ã²ÉÓÃÐ麯Êý¡£ÐÂÒ»µãµÄ·½Ê½ÊǶ¨ÒåÒ»¸ö»ùÀ࣬ÈçIetegrator£¬¶¨ÒåÒ»¸öÐ麯Êý£¬Ôڼ̳Ð×ÓÀàÖж¨Òåʵ¼ÊÐèÒª±»»ý·ÖµÄº¯Êý¡£
305 <source lang="C">
306 class Integrator{
307 public:
309 double integrate(double a,double b,int numSamplePoints)
311 double delta=(b-a)/..;
314 for(int i=0;i<numSamplePoints;++i)
315   sum+=functionToIntegrate(a+i*delta);
316 reutrn sum*(b-a)/numSamplePoints;
319 virtual double functionToIntegrate(double x)=0;
322 class IntegrateMyFunction:Integrator{
323 public:
324   virtual double functionToIntegrate(double x)
325   {
326      return cos(x);
327   }
329 </source>
331   Í¬CÀàËÆ£¬Ð麯Êý·ÖÅÉÔÚÄÚ²¿Ñ­»·»áµ¼ÖÂÐÔÄÜϽµ(Èç¹û¸Ãº¯ÊýÖ´ÐÐʱ¼ä±È½Ï³¤£¬ÔòÐ麯ÊýµÄËðʧ¿ÉÒÔºöÂÔ²»¼Æ)¡£¶ÔÓÚÐÔÄÜ£¬ÐèÒªÔÚ»ý·Öº¯ÊýÖвÉÓÃinline the callbackº¯Êý¡£
332   
333   ÏÂÃæ¾Í½éÉÜÈýÖÖ·½·¨ÊµÏÖinlined callbacks¡£
335  1. Expression templates
337    ÕâÊÇÒ»ÖÖ¾«Ï¸£¬¸´ÔӵĽâ¾ö·½·¨¡£ËüÀ©Õ¹ºÍά»¤ÆðÀ´±È½ÏÄÑ¡£Ò»°ã²»±ØÀË·ÑÄãµÄ¾«Á¦È¥Ñ¡ÔñÕâÖÖ·½·¨¡£
339  2. stl·ç¸ñµÄº¯Êý¶ÔÏó
341    Callbackº¯Êý¿ÉÒÔ±»·â×°ÔÚÒ»¸öÀàÖУ¬´Ó¶ø´´½¨Ò»¸öº¯Êý¶ÔÏó»òÕ߽зº¯Êý¡£
343 <source lang="C">
345 class MyFunction{
346 public:
348    //×¢Ò⣺Ϊinline ³ÉÔ±º¯Êý
349   double operator()(double x)
350   {return 1.0/(1.0+x);}
353 template<class T_function>
354 double integrate(double a,double b,int numSamplePoints,T_function f)
356   double delta=(b-a)/(numSamplePoints-a);
357   double sum=0;
359   for(int i=0;i<numSamplePoints;++i)
360     sum+=f(a+i*delta);
362   return sum*(b-a)/numSamplePoints;
366 //Ó÷¨
367 integrate(0.3,0.5,30,MyFunction())£»
369 </source>
371   Ò»¸öMyFunctionµÄ¶ÔÏó×÷Ϊ²ÎÊý´«Èëintegrateº¯Êý¡£C++±àÒëÆ÷»á¾ÛÏÖ»¯integrate, ÓÃMyFunctionÀ´Ìæ»»T_function;ÕâÑù»áµ¼ÖÂMyFunction::operator()±»inlined½øintegrate()µÄÄÚ²¿Ñ­»·ÖС£
373   ÕâÖÖ·½·¨µÄȱµãÊÇÓû§±ØÐ뽫ËùÓÐËûÏëµ÷Óõĺ¯Êý·â×°ÔÚÀàÖС£Í¬Ñù£¬Èç¹ûCallbackº¯ÊýÐèÒª²ÎÊý£¬Ôò±ØÐëÌṩ¸øMyFunctionµÄ¹¹Ô캯Êý£¬²¢±£´æΪ³ÉÔ±±äÁ¿¡£
375   ×¢Ò⣬Äã¿ÉÒÔÏòÉÏÀýµÄintegrate´«È뺯ÊýÖ¸Õë¡£µ«ÕâºÍC·ç¸ñµÄcallbackº¯ÊýÒ»Ñù£¬²»»áÔÚÑ­»·Öн«Äã´«ÈëµÄº¯ÊýÖ¸Õë½øÐÐinline»¯¡£
377   3. º¯ÊýÖ¸Õë×÷Ϊģ°æ²ÎÊý
378    µÚÈýÖÖ·½·¨ºÜ¼òµ¥£º
380 <source lang="C">
382 double function1(double x)
384   return 1.0/(1.0+x);
387 template<double T_function(double)>
388 double integrate(double a,double b,int numSamplePoints)
391   double delta=(b-a)/(numSamplePoints-1);
392   double sum=0.0;
393   
394   for(int i=0;i<numSamplePoints;++i)
395      sum+=T_function(a+i*delta);
397   return sum*(b-a)/numSamplePoints;
401 //..
402 integrate<function1>(1.0,2.0,100);
403 </source>
404     
405   integrate()º¯Êý½«Ö¸Ïòcallbackº¯ÊýµÄº¯ÊýÖ¸Õë×÷Ϊģ°æ²ÎÊý¡£ÓÉÓÚÕâ¸öÖ¸ÕëÔÚ±àÒëÆÚ¼ä¾Í¿ÉÒÔÈ·¶¨£¬ËùÒÔfunction1±»inline½øÈëÄÚ²¿Ñ­»·¡£²Î¿¼oon-listµµ°¸µÄSumclass algorithmsÌõÄ¿¡£
407 *** 1.5 ¿ØÖÆ´úÂëÅòÕÍ
408   ´úÂëÅòÕͶÔÓÚ»ùÓÚÄ£°æµÄ¿âÀ´ËµÊÇÒ»¸öÎÊÌâ¡£ÀýÈ磬ÄãʹÓÃqueueµÄһЩʵÀý£º
410 <source lang="C">
411   queue<float>
412   queue<int>
413   queue<Event>
414 </source>
416   ÄãµÄ³ÌÐò»áÓÐÈý¸ö²»Í¬°æ±¾µÄqueue<>¡£Õâ¶ÔÓÚʹÓûùÓÚÐ麯Êý¶à̬µÄÀÏ·ç¸ñc++¿â²¢²»ÊÇÎÊÌâ¡£
418   µ«ÊÇ£¬Êµ¼ÊÖбàÒëÆ÷»áÉú³ÉһЩ»ÄÃýµÄ¶àÓà´úÂëʹµÃÎÊÌâ¸ü¼ÓÑÏÖØ¡£
419   - Ò»Ð©±àÒëÆ÷ÔÚÿ¸öÄ£¿éÖоÛÏÖÄ£°æ£¬²¢ÇÒÔÚÁ¬½Óʱ±¨Öظ´¶ÔÏó´íÎó¡£
420   - Ò»Ð©±àÒëÆ÷(ÀϵÄ)¾ÛÏÖÄ£°æµÄÿһ¸ö³ÉÔ±º¯Êý¡£ISO/ANSIµÄ±àÒëÆ÷½ûÖ¹ÕâÖÐ×ö·¨£º±àÒëÆ÷Ó¦¸ÃÖ»¾ÛÏÖÕæÕýʵÓõÄÄ£°æ¡£
422   ÕâЩÎÊÌâÒ»²¿·ÖÊÇÎÒÃÇ×Ô¼ºÒýÆðµÄ: Ê¹ÓÃÄ£°æÉú³É´úÂëÌ«ÈÝÒ×ÁË£¬ÒÔÖÁÓÚ³ÌÐòÔ±ºÜÉÙ¿¼ÂÇËüµÄºó¹û¡£ÎÒÇ÷ÏòÓÚÔÚÈκεط½Ê¹ÓÃÄ£°æ£¬ºÜ¶àʱºò¸ü²»²»È¥¿¼ÂÇʹÓÃÐ麯Êý¡£ÎÒ¸öÈËÒ»°ã²»¹ØÐÄ´úÂëÅòÕÍ£¬ÒòΪÎҵijÌÐòÒ»°ã¶¼ºÜС¡£µ«Êǹ¤×÷ÔÚ´óÐͳÌÐòµÄÈ˱ØÐ뿼ÂÇʹÓÃÄ£°æ»¹ÊÇÐ麯Êý¡£
424  - ËäȻģ°æ¿ÉÒÔ´øÀ´½ÏºÃµÄÐÔÄÜ£¬µ«ÊÇÒ²Òâζ×Å´ó¶àÊýÇé¿ö´øÀ´½Ï¶àµÄ´úÂë¡£(Èç¹ûÄãÖ»ÓÃÄ£°æÆäÖеÄÒ»¸öʵÀý£¬ËûÃDz»»á¸øÄã¸ü¶àµÄ´úÂë)
425  - Ð麯Êý¸øÄã×îÉٵĴúÂ룬µ«ÊÇÈ´ÊǽÏÂýµÄ´úÂë¡£ÕâÖÖÐÔÄÜËðʧÔÚÐ麯Êýº¯Êý¼ÆËãÁ¿½Ï´óµÄʱºòÊÇ¿ÉÒÔºöÂԵģ¬»òÕßÔÚº¯Êýµ÷ÓýÏÉÙµÄʱºò¡£
427  µ±È»£¬Ð麯ÊýºÍÄ£°æ²¢²»ÊǶÔÿ¸öÎÊÌⶼÊÇ¿ÉÒÔÑ¡ÔñµÄ¡£Èç¹ûÄãÐèÒª¶¯Ì¬µÄ¶à̬£¬Ä£°æ¾Í²»ÄÜʤÈΡ£ÏÂÃæ¾Í¸ø³öһЩ½µµÍ´úÂëÅòÕ͵Ľ¨Òé¡£
429 **** 1.5.1 ±ÜÃâkitchen-sinkÄ£°æ²ÎÊý
430   ½«ÀàµÄÿ¸öÊôÐÔ¶¼×÷Ϊģ°æ²ÎÊýÊǺÜÓÐÓÕ»óÁ¦µÄ¡£ÏÂÃæ¾ÍÊÇÒ»¸ö¿äÕŵÄÀý×Ó¡£
432 <source lang="C">
433 template<typename number_type,int N,intM,bool sparse,typename allocator,bool symmetric,bool banded,int bandwidthIfBanded>
434 class Matrix;
435 </source>
437   Ã¿¸ö¶àÓàµÄÄ£°æ²ÎÊý¶¼Îª´úÂëÅòÕÍÌṩÁË»ú»á¡£Èç¹ûÄãʹÓÃÁ˺ܶàÖÖ"kitchen-sink"µÄÄ£°æÀ࣬ÄãÓ¦¸Ã¿¼ÂÇͨ¹ýÐ麯Êý£¬³ÉԱģ°æµÈ¼õÉÙһЩģ°æ²ÎÊý¡£
439   ÀýÈ磬ÎÒÃÇÓÐÒ»¸öÀàlist<>¡£ÎÒÃÇÏëÒªÓû§ÓÐÄÜÁ¦Ìṩ×Ô¼ºµÄÄÚ´æ·ÖÅäÆ÷£¬ËùÒÔÎÒÃÇ¿ÉÒÔ½«Alloctor×÷Ϊһ¸öÄ£°å²ÎÊý:
441 <source lang="C">
442 list<double ,allocator<double>> A;
443 list<double , my_alloctor<double>>B;
444 </source>
446  ÕâÑù»áΪAºÍBÉú³É²»Í¬µÄlist°æ±¾£¬¾¡¹ÜÁ½Õߴ󲿷ֶ¼ÊÇһģһÑùµÄ(±ÈÈçÄãÒª±éÀúlist£¬Äã¾Í²»ÐèÒª¿¼ÂÇËüÔÚÄÚ´æÖÐÊÇÔõô·ÖÅäµÄ)¡£²ÉÓÃalloactor×÷Ϊģ°æ²ÎÊýÓÐʲôºÃ´¦Â𣿼¸ºõûÓÐ-ÄÚ´æ·ÖÅäÊǺÜÂýµÄ£¬ËùÒÔ¸½¼ÓµÄÐ麯ÊýËðʧ¶ÔËûÀ´ËµÊÇ¿ÉÒÔ½ÓÊܵġ£ÏÂÃæµÄ·½·¨¿ÉÒÔ»ñµÃͬÑùÁé»îµÄÉè¼Æ:
448 <source lang="C">
449 list<double> A(allocator<double>());
450 list<double> B(my_allocator<double>());
451 </source>
453   ÆäÖÐallocatorºÍmy_allocatorÊǶà̬µÄ¡£
455 **** 1.5.2 ½«º¯Êý¶¨ÒåÔÚÄ£°æÍâ
456    Äã¿ÉÒÔͨ¹ý½«º¯Êý¶¨ÒåÒƶ¯ÖÁÀඨÒåµÄÍâÃæÀ´±ÜÃâ´´½¨²»ÐèÒªµÄÖظ´³ÉÔ±º¯Êý¡£ÀýÈ磬ÏÂÃæÊÇÒ»¸öArray3DÀàµÄ¿ò¼Ü¡£
458 <source lang="C">
459 template<class T_numtype>
460 class Array3D{
461 public:
462   //È·±£ÏÂÃæµÄarrayÓÐͬÑùµÄ´óС
463   template<class T_numtype2>
464   bool shapeCheck(Array3D<T_numtype2>&);
466 private:
467   int base[3];              //Æðʼx,y,zµÄindexÖµ
468   int extent[3];            //ÿ¸öx,y,zµÄ³¤¶È
471 template<class T_numtype> template<class T_numtype2>
472 bool Array3D<T_numtype>::shapeCheck(Array3D<T_numtype2>&B)
474   for(int i=0;i<3;++i)
475     if((base[i]!=B.base(i))||(extent[i]!=B.extent(i)))
476       return false;
478    return true;
481 </source>
484   shapeCheck()º¯ÊýÈ·¶¨Á½¸öarrayÊÇ·ñÓÐͬÑùµÄÆðʼindexºÍ³¤¶È¡£Èç¹ûÄãÓкܶàÖÖ²»Í¬µÄarray(Array3D<float>,Array3D<int>,...),Äã»á×îÖÕÓµÓкܶà¸öshapeCheck()º¯ÊýµÄʵÀý¡£µ«ÊÇ£¬ÆäʵÕâЩʵÀýÊÇÍêÈ«Ò»ÑùµÄ£¬ÒòΪshapeCheck()²¢²»Ê¹ÓòÎÊýT_numtypeºÍT_numtype2¡£
486   ÎªÁ˱ÜÃâ²úÉú¶àÖصÄʵÀý£¬Äã¿ÉÒÔ½«shapeCheck()Òƶ¯ÖÁûÓÐÄ£°æ²ÎÊýµÄ»ùÀ࣬»òÕßÒÆÖÁÈ«¾Öº¯Êý£¬ÈçÏ£º
488 <source lang="C">
489 class Array3D_base{
491 public:
492   bool shapeCheck(Array3D_base&);
494 private:
496   int base[3];
497   int extent[3];
500 template<class T_numtype>
501 class Array3D:public Array3D_base{
502   ...
504 </source>
506 ÓÉÓÚshapeCheck()ÏÖÔÚ²»ÔÚÄ£°æÀàÖУ¬ËùÒÔÖ»ÓÐÒ»¸öËüµÄʵÀý¡£Èç¹ûÄãÕýºÃÊÇC++±àÒëÆ÷µÄ×÷Õߣ¬¶Áµ½ÕâÀÄãÓ¦¸Ã×¢Ò⣬Õâ¸öÎÊÌâ¿ÉÒÔͨ¹ý×Ô¶¯µÄ½øÐÐÄ£°æ²ÎÊýÓÐЧÐÔ¼ì²âÀ´±ÜÃâ¡£
508 **** 1.5.3 Inlining ¼¶±ð
509   Ò»°ãÇé¿ö£¬ÎÒÇ÷ÏòÓÚÔÚBlitz++Öн«ºÜ¶à¶«Î÷inline»¯£¬ÒòΪÕâÑù×Ó»áЭÖú±àÒëÆ÷ÓÅ»¯(¶ÔÓÚÄÇЩ²»×öinterprocedural·ÖÎöºÍÇ¿»¯inliningµÄ±àÒëÆ÷)¡£Èç¹ûÓÐÒ»Ì죬ÎҸоõBlitz++ÖеÄinlineÌ«¶àÁË£¬ÕâÓÐÒ»ÖÖ²ßÂÔ¿ÉÒÔ´¦ÀíÕâ¸öÎÊÌâ¡£
511 <source lang="C">
512 #if BZ_INLINING_LEVEL==0
513   //NO INLINING
514   #define _bz_inline1
515   #define _bz_inline2
516 #elif BZ_INLINING_LEVEL==1
517   #define _bz_inline1 inline
518   #define _bz_inline2
519 #elif BZ_INLINING_LEVEL==2
520   #define _bz_inline1 inline
521   #define _bz_iiline2 inline
522 #endif
524 _bz_inline void foo(Array<int>&A)
526   //...
528 </source>
530   Óû§Èç¹û²»ÏëÒªÈκεÄinline£¬¿ÉÒÔ-DBZ_INLINING_LEVEL=0À´±àÒë,»¹¿ÉÒÔ¿ØÖÆÆäΪ1,2À´¿ØÖÆINLINEµÄ³Ì¶È¡£
532 *** 1.6 ÈÝÆ÷
533   ÈÝÆ÷Àà¿ÉÒÔ´óÖ·ÖΪÁ½¸ö²¿·Ö:STL·ç¸ñ(»ùÓÚiteratorµÄ)ºÍData/View·ç¸ñµÄ¡£
534 **** 1.6.1 ·ç¸ñÈÝÆ÷
535  - Ò»¸öÈÝÆ÷ÀàÓµÓÐËùÓеÄÊý¾Ý¡£
536  - ×ÓÈÝÆ÷ͨ¹ýiterator rangeÀ´Ö¸¶¨£¬Ò»°ã²ÉÓÿª·Å-·â±ÕµÄÇøÓò:[iter1,iter2)¡£
537  - ÕâÖÖÉè¼Æ·ç¸ñÀ´×ÔSTL£»Èç¹ûÄãͨ¹ýÕâÖÖ·½·¨Ð´ÈÝÆ÷£¬Äã¿ÉÒÔÈ¡µÃÎÞ·ìµ÷ÓÃSTLËã·¨µÄÓÅÊÆ¡£
538  - ÈÝÆ÷ÖÁÉÙÐèÒªÓÐ1-DÐòÁеÄÓïÒå¡£ËùÓеÄ×ÓÈÝÆ÷±ØÐëintervals½øÄǸö1DµÄ˳Ðò¡£Õâ»á¶ÔÓÚ¶àάÊý×é»á²úÉúÎÊÌâ¡£(ÀýÈ磬A(2:6:2,2:6:2)µÄÔªËØÃ÷ÏÔ²»¾ßÓÐ1-DÐòÁеÄÓïÒå)
539  - iterator»ùÓÚÖ¸ÕëµÄ¸ÅÄ¶øÖ¸ÕëÓÖÊÇC++ÖÐ×îÈÝÒ×·¸´íÎóµÄµØ·½Ö®Ò»¡£Õâµ¼ÖºܶàÈÝÒ×´íÎóµÄʹÓÃiterator¡£
540  - ¶ÔÓÚº¯ÊýÀ´Ëµ£¬½«ÈÝÆ÷×÷ΪֵÀ´·µ»Ø±È½ÏÀ§ÄÑ¡£Ïà·´£¬ÈÝÆ÷¿ÉÒÔÓô«Èë²ÎÊýµÄ·½·¨(argument)À´½ÓÊܽá¹ûÄÚÈÝ¡£
542 **** 1.6.2 Data/View ÈÝÆ÷
543   - ÈÝÆ÷µÄÄÚÈÝ(Êý¾Ý)±£´æÔÚÈÝÆ÷Íⲿ¡£ÈÝÆ÷Ö»ÊÇÒ»¸öÊý¾ÝµÄÇáÁ¿¼¶¾ä±ú¡£
544   - ¶à¸öÈÝÆ÷¶ÔÏó¿ÉÒÔË÷Òýͬһ¸öÊý¾ÝÄÚÈÝ£¬µ«ÌṩËüµÄ²»Í¬µÄÊÓͼ¡£
545   - Ê¹Óòο¼¼ÆÊý:ÈÝÆ÷µÄÊý¾ÝÄÚÈÝÔÚ×îºóÒ»¸ö¾ä±úÏú»ÙºóÏú»Ù¡£ÕâÌṩÁËÒ»¸öÀ¬»ø»ØÊÕ»úÖƵÄʵÏÖ(ÇÒÓÐЧÂÊ)¡£
546   - ÓÐЩÇé¿ö϶¨Òå×ÓÈÝÆ÷±È½ÏÈÝÒ×(ÀýÈ磬¶àάÊý×éµÄ×ÓÊý×é)¡£
547   - ×ÓÈÝÆ÷¿ÉÒÔÊǵÚÒ»¼¶±ð(first class)µÄÈÝÆ÷(ÀýÈçµ±ÄãÈ¡µÃArray<N>µÄ×ÓÊý×飬½á¹ûÈÔÈ»ÊÇArray<N>£¬¶ø²»ÊÇSubArray<N>)
548   - Ê¹ÓÃÒýÓüÆÊýµÄÈÝÆ÷ÐèÒª½ÏΪ¾«Ï¸µÄÉè¼Æ·½·¨¡£
549   - ´Óº¯ÊýÖзµ»ØÈÝÆ÷±È½ÏÈÝÒ×£¬²¢ÇÒ¿ÉÒÔ½«ÈÝÆ÷°´Öµ´«µÝ¡£
551 *** 1.7 AliasigºÍÏÞÖÆ
553  Aliasing¶ÔC++¿Æѧ¼ÆËã¿âÀ´ËµÊÇÓ°ÏìÐÔÄܵÄÒ»´óÎÊÌâ¡£ÀýÈ磬¿¼ÂǼÆËã1½×¾ØÕóA <- A+xxT£º
555 <source lang="C">
556 void rank1Update(Matrix&A,const Vector&x)
558   for(int i=0;i<A.rows();++i)
559      for(int j=0;j<A.cols();++j)
560         A(i,j)+=x(i)*x(j);
562 </source>
564  ¶ÔÓںõÄÐÔÄÜ£¬±àÒëÆ÷ÐèÒª±£³Öx(i)ÔڼĴæÆ÷Öжø²»ÊÇÔÚÄÚ²¿Ñ­»·ÀïÖظ´µÄÔØÈëËü¡£¾¡¹ÜÈç´Ë£¬±àÒëÆ÷²»ÄÜÈ·¶¨µÄÊÇÔÚAÖеÄÊý¾Ý²»»á¸²¸Çx(i)ÖеÄÊý¾Ý¡£Õâ¶ÔÓÚ¾ØÕóºÍÏòÁ¿ÀàµÄÉè¼ÆÀ´ËµÊDz»¿ÉÄܲÉÓõģ¬µ«ÊDZàÒëÆ÷²»ÖªµÀÕâЩ¡£AliasingµÄ¿ÉÄÜÐÔµ¼Ö±àÒëÆ÷²úÉúµÍЧÂʵĴúÂë¡£
566  ÁíÒ»¸öAliasingµÄ½á¹ûÊÇÖжÏÑ­»·µÄÈí¼þÁ÷Ë®Ïß¡£ ÀýÈ磬һ¸öDAXPY²Ù×÷y <- y + a*x
568 <source lang="C">
569   void daxpy(int n,double a,double*x,double *y)
571   for(int i=0;i<n;++i)
572     y[i]=y[i]+a*x[i];
575 </source>
577  ÎªÁËÈ¡µÃºÃµÄЧÂÊ£¬Ò»¸öÓÅ»¯±àÒëÆ÷»á²¿·ÖµÄÕ¹¿ªÑ­»·£¬È»ºó½øÐÐÈí¼þÁ÷Ë®ÏßÀ´ÕÒµ½ÓÐЧµÄÄÚ²¿Ñ­»··½·¨¡£Éè¼ÆÕâ¸ö·½·¨¾­³£ÐèÒª¸Ä±äÑ­»·ÖеÄÔØÈëºÍ´æ´¢Ë³Ðò£¬ÀýÈç:
579 <source lang="C">
580   //ÐéÄâµÄÁ÷Ë®»¯DAXPYÑ­»·
581   double* xt=x;
582   double* yt=y;
583   for(;i<n;i+=4)
584   £û
585      double t0=yt[0]+a*xt[0];
586      double t1=yt[1]+a*xt[1];
587      yt[0]=t0;
588      double t2=yt[2]+a*xt[2];
589      double t3=yt[3]+a*xt[3];
590      yt[1]=t1
591      double t3=yt[3]+a*xt[3];
592      i+=4;
593      xt+=4;
594      yt[2]=t2;
595      yt+=4;
596      yt[3]=t3;
597   }
598 </source>
600   ²»ÐÒµÄÊÇ£¬±àÒëÆ÷ÎÞ·¨¸Ä±äÔØÈëºÍ´æ´¢µÄ˳ÐòÒòΪx,yÖ¸Õë¿ÉÄÜÔÚÄÚ´æÖÐÖصü¡£ÔÚFortran77/90ÖУ¬±àÒëÆ÷¿ÉÒÔ¼ÙÉèÊý×éµØַûÓÐÖصþ¡£¶ÔÓÚÔÚcacheÖеÄÊý×éÕâ»áµ¼ÖÂ20£­50£¥µÄÐÔÄܲîÒì¡£ÕâÒÀÀµÓÚÌض¨µÄÑ­»·/¼Ü¹¹¡£Aliasing¶ÔÓÚout-of-cacheÊý×éÀ´Ëµ²»ÊÇ´óÎÊÌâ¡£
602   ÓÅÐãµÄc/c++±àÒëÆ÷»á×öAliasing·ÖÎö£¬Ä¿µÄÊÇÈ·¶¨ÊÇ·ñ¿ÉÒÔÈÏΪָÕë¿É±»ÈÏΪÊÇÖ¸Ïò²»ÖصþÄÚ´æµÄ¡£Alias·ÖÎö¿ÉÒÔ¼õÉÙÐí¶àµÄAliasing¿ÉÄÜÐÔ£¬µ«ÊÇËû²»ÊÇÍêÃÀµÄ¡£ÀýÈ磬·ÖÎöÏñdaxpyº¯ÊýµÄ³ÌÐò±ØÐë×öÈ«¾Ö·ÖÎö¡£±àÒëÆ÷±ØÐëÔÚͬһʱ¼ä¿¼ÂÇÄãÖ´ÐеÄËùÓк¯Êý¡£³ý·ÇÄãµÄ±àÒëÆ÷×öÁËÈ«¾Öalias·ÖÎö(SGI»á),·ñÔòÄã¾Í»áÓÐaliasingÎÊÌâ¡£
604   NCEG(Numerical C Extensions Group)Éè¼ÆÁËÒ»¸ö¹Ø¼ü×Örestrict,¿ÉÒÔ±»Ò»Ð©±àÒëÆ÷ʶ±ð£¨KAI,Cray,SGi,Intel,gcc)¡£restrictÊÇÒ»¸ö¿ÉÒÔ¸æËß±àÒëÆ÷¸Ã±äÁ¿Ã»ÓÐAliasingµÄÐÞÊηû¡£ÀýÈ磺
606 <source lang="C">
607   double * restrict a;  //a[0],a[1]..ûÓÐaliasing
608   int & restrict b ;    //bûÓÐaliases
609 </source>
611   ÔÚC++ÖÐrestrictµÄÃ÷È·¶¨Òå²¢²»ÊǺÜnailed down¡£µ«Êǵ±restrictʹÓú󣬱àÒëÆ÷¿ÉÒÔ×ÔÓɵÄÓÅ»¯¶ø²»È¥¿¼ÂÇ×°ÔØ£¯´æ´¢Ë³Ðò¡£
613   ²»ÐÒµÄÊǽ«restrict¼ÓÈëiso/ansi c++±ê×¼µÄÌáÒé±»·ñ¾öÁË¡£ÎÒÃÇ×îÖյõ½µÄÊÇÒ»¸öÄÜÁ¦ÓÐÕùÒéµÄvalarray¡£valarrayÊý×éÀàÉè¼ÆΪûÓÐaliasing£¬Òò´Ë¿ÉÒÔÔÊÐí±àÒëÆ÷¶ÔÆäÉϵIJÙ×÷½øÐÐÓÅ»¯¡£
615   ¾¡¹ÜÈç´Ë£¬restrictÒѾ­±»ansi/iso cÁÐΪ±ê×¼£¬Òò´ËÓпÉÄÜÔÚÏÂÒ»´ÎÖмÓÈëc++±ê×¼¡£µ±¿ÉÒÔʹÓÃrestrictʱ£¬¿ª·¢³ÌÐò¿ÉÒÔʹÓÃÔ¤ÏȱàÒëkludge¡£ÀýÈç,blitz++¶¨ÒåÁËÈçϵĺ꣺
617 <source lang="C">
618  #ifdef BZ_HAS_RESTRICT
619   #define _bz_restrict restrict
620  #else
621   #define _bz_restrict
622  #endif
625 class Vector{
626 double * _bz_restrict data_;
629 </source>
631   ÔÚһЩƽ̨ÉÏ£¬±àÒëÆ÷ÓÐÑ¡Ïî¿ÉÒÔÔÊÐí±àÒëÆ÷¼ÙÉèûÓÐaliasing¡£Õâ¿ÉÒÔµ¼ÖºõÄЧ¹û£¬µ«ÊDZØÐë¸øÓè×¢Òâ¡£ÕâЩѡÏî»á¸Ä±äÄãËùÓгÌÐòÖеÄÖ¸ÕëÓïÒâÒåsemantics of pointers¡£Èç¹ûÄã¶ÔÖ¸Õë×öÁËдÌØÊâ´¦Àí£¬Õâ¿ÉÄܻᵼÖÂÎÊÌâ¡£
633 *** 1.8 TraitsÝÍÈ¡Æ÷
634   Traits¼¼ÊõÊÇÓÉNathan MyersÔÚC++ Report 1995ÄêJune·¢±íµÄ[[http://www.cantrip.org/traits.html][¡¶Traits:a new and useful template technique¡·]]ÖÐ×îÐÂÌá³öµÄ¡£
635   TraitÀà±£´æһЩӳÉä¹Øϵ£¬½«Ò»Ð©¸ÅÄîÓ³Éäµ½ÁíһЩÉÏÈ¥¡£Äã¿ÉÒÔ´ÓÒÔ϶«Î÷·¢³öÓ³Éä:
636   - ÀàÐÍTypes
637   - ±àÒëÆÚ¼äÒÑÖªµÀµÄÖµ(ÀýÈç³£Êý)
638   - ÉÏÊöÁ½ÕßµÄTuples
639   - ÉÏÊöµÄTuples
641   ²¢ÇÒ¿ÉÒÔÓ³Éäµ½¼¸ºõËùÓÐÄãÏëÒªµÄ£¨ÀàÐÍ£¬³£Êý£¬ÔËÐÐÆÚ¼ä±äÁ¿£¬º¯Êý)¡£
643 **** 1.8.1 Àý×Ó: average()
644   ¿¼ÂÇÏÂÃæµÄ´úÂ룬Ëü¼ÆËãÒ»¸öÊý×éµÄƽ¾ùÖµ:
646 <source lang="C">
647 template<class T>
648 T average(const*T data,int numElements)
650   T sum=0;
651   for (int i=0;i<numElements;++i)
652       sum+=data[i];
653   return sum/numElements;
656 </source>
658   Èç¹ûTÊÇÒ»¸ö¸¡µãÊý£¬Ëü»á¹¤×÷µÄºÜºÃ£¬µ«ÊÇÈç¹ûÊÇһϵÄÇé¿ö£¬¾Í²»ºÃ˵ÁË£º
659  - TÊÇÒ»¸öÕûÊý(int,long):¼ÆËãµÄƽ¾ùÖµ¾Í»á±»½Ø¶Ï²¢°´ÕÕÕûÊýÀ´·µ»Ø
660  - TÊÇÒ»¸ö×Ö·û:ÇóºÍ²Ù×÷»áÒç³ö¡£
662   ¶ÔÓÚÕûÊýÀàÐÍ£¬ 
664