??xml version="1.0" encoding="utf-8" standalone="yes"?>日本精品久久久久中文字幕 ,久久香蕉国产线看观看猫咪?v,色综合久久中文字幕综合网http://m.shnenglu.com/paladino/category/4425.html在努力、磨l、打M不断地向着理想前进zh-cnTue, 20 May 2008 01:11:23 GMTTue, 20 May 2008 01:11:23 GMT60sizeof 全解?/title><link>http://m.shnenglu.com/paladino/articles/26578.html</link><dc:creator>Gu.paladino</dc:creator><author>Gu.paladino</author><pubDate>Mon, 18 Jun 2007 10:26:00 GMT</pubDate><guid>http://m.shnenglu.com/paladino/articles/26578.html</guid><wfw:comment>http://m.shnenglu.com/paladino/comments/26578.html</wfw:comment><comments>http://m.shnenglu.com/paladino/articles/26578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/paladino/comments/commentRss/26578.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/paladino/services/trackbacks/26578.html</trackback:ping><description><![CDATA[<div id="u88o4io" class="postTitle">0. 前向声明</div> <div id="c64aium" class="postText"> <p>sizeofQ一个其貌不扬的家伙Q引无数菜鸟竟折腎ͼ虾我当初也没少犯迷p,U着“辛苦我一个,q福千万?#8221;的伟大思想Q我军_其可能详l的ȝ一下?/p> <p>但当我ȝ的时候才发现Q这个问题既可以单,又可以复杂,所以本文有的地方ƈ不适合初学者,甚至都没有必要大作文章。但如果你想“知其Ӟ更知其所以然”的话Q那么这文章对你或许有所帮助?/p> <p>菜鸟我对C++的掌握尚未深入,其中不乏错误Q欢q各位扔砖砸蛋?/p> <p>1. 定义</p> <p>sizeof是何方神圣?sizeof乃C/C++中的一个操作符QoperatorQ是也,单的说其作用是q回一个对象或者类型所占的内存字节数?</p> <p>MSDN上的解释为:</p> <div id="gu4owow" class="postRefrence"> <p>The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types).</p> <p>This keyword returns a value of type size_t.</p> </div> <p>其返回值类型ؓsize_tQ在头文件stddef.h中定义。这是一个依赖于~译pȝ的|一般定义ؓQ?/p> <div id="i4g8ciy" class="postCode"><font color="#0000ff">typedef</font> <font color="#0000ff">unsigned</font> <font color="#0000ff">int</font> size_t; </div> <p>世上~译器林林L,但作Z个规范,它们都会保证char、signed char和unsigned char的sizeofgؓ1Q毕竟char是我们编E能用的最数据类型?/p> <p>2. 语法</p> <p>sizeof有三U语法Ş式,如下Q?/p> <div id="48seg4o" class="postConclusion">1) sizeof( object ); // sizeof( 对象 );<br>2) sizeof( type_name ); // sizeof( cd );<br>3) sizeof object; // sizeof 对象;<br></div> <p>所以,</p> <div id="qgwcyom" class="postCode"><font color="#0000ff">int</font> i;<br><font color="#0000ff">sizeof</font>( i ); <font color="#008000">// ok</font><br><font color="#0000ff">sizeof</font> i; <font color="#008000">// ok</font><br><font color="#0000ff">sizeof</font>( <font color="#0000ff">int</font> ); <font color="#008000">// ok</font><br><font color="#0000ff">sizeof</font> <font color="#0000ff">int</font>; <font color="#008000">// error</font> </div> <p>既然写法3可以用写?代替Qؓ求Ş式统一以及减少我们大脑的负担,W?U写法,忘掉它吧Q?/p> <p>? 际上Qsizeof计算对象的大也是{换成对对象类型的计算Q也是_同种cd的不同对象其sizeof值都是一致的。这里,对象可以q一步g伸至? 辑ּQ即sizeof可以对一个表辑ּ求|~译器根据表辑ּ的最l结果类型来定大小Q一般不会对表达式进行计。如Q?</p> <div id="mgiuoe8" class="postCode"><font color="#0000ff">sizeof</font>( 2 ); <font color="#008000">// 2的类型ؓintQ所以等价于 sizeof( int );</font><br><font color="#0000ff">sizeof</font>( 2 + 3.14 ); <font color="#008000">// 3.14的类型ؓdoubleQ?也会被提升成doublecdQ所以等价于 sizeof( double );</font> </div> <p>sizeof也可以对一个函数调用求|其结果是函数q回cd的大,函数q不会被调用Q我们来看一个完整的例子Q?/p> <div id="c8gke8s" class="postCode"><font color="#0000ff">char</font> foo()<br>{<br>    printf(<font color="#ff00ff">"foo() has been called.\n"</font>);<br>    <font color="#0000ff">return</font> 'a';<br>}<br><font color="#0000ff">int</font> main()<br>{<br>    size_t sz = <font color="#0000ff">sizeof</font>( foo() ); <font color="#008000">// foo() 的返回值类型ؓcharQ所以sz = sizeof( char )Qfoo()q不会被调用</font><br>    printf(<font color="#ff00ff">"sizeof( foo() ) = %d\n"</font>, sz); <br>} </div> <p>C99标准规定Q函数、不能确定类型的表达式以及位域(bit-fieldQ成员不能被计算sizeof|即下面这些写法都是错误的Q?/p> <div id="g8ko8uu" class="postCode"><font color="#0000ff">sizeof</font>( foo ); <font color="#008000">// error</font><br><br><font color="#0000ff">void</font> foo2() { }<br><font color="#0000ff">sizeof</font>( foo2() ); <font color="#008000">// error</font><br><br><font color="#0000ff">struct</font> S<br>{<br>    <font color="#0000ff">unsigned</font> <font color="#0000ff">int</font> f1 : 1;<br>    <font color="#0000ff">unsigned</font> <font color="#0000ff">int</font> f2 : 5;<br>    <font color="#0000ff">unsigned</font> <font color="#0000ff">int</font> f3 : 12;<br>};<br><font color="#0000ff">sizeof</font>( S.f1 ); <font color="#008000">// error</font> </div> <p>3. sizeof的常量?/p> <p>sizeof的计发生在~译时刻Q所以它可以被当作常量表辑ּ使用Q如Q?/p> <div id="8sqsikm" class="postCode"><font color="#0000ff">char</font> ary[ <font color="#0000ff">sizeof</font>( <font color="#0000ff">int</font> ) * 10 ]; <font color="#008000">// ok</font> </div> <p>最新的C99标准规定sizeof也可以在q行时刻q行计算Q如下面的程序在Dev-C++中可以正执行: </p> <div id="o8w8qg4" class="postCode"><font color="#0000ff">int</font> n;<br>n = 10; <font color="#008000">// n动态赋?/font><br><font color="#0000ff">char</font> ary[n]; <font color="#008000">// C99也支持数l的动态定?/font><br>printf(<font color="#ff00ff">"%d\n"</font>, <font color="#0000ff">sizeof</font>(ary)); <font color="#008000">// ok. 输出10</font> </div> <p>但在没有完全实现C99标准的编译器中就行不通了Q上面的代码在VC6中就通不q编译。所以我们最好还是认为sizeof是在~译期执行的Q这样不会带来错误,让程序的可移植性强些?/p> <p>4. 基本数据cd的sizeof</p> <p>q里的基本数据类型指short、int、long、float、doubleq样的简单内|数据类型,׃它们都是和系l相关的Q所以在不同的系l下取值可能不同,q务必引h们的注意Q尽量不要在q方面给自己E序的移植造成ȝ?/p> <p>一般的Q在32位编译环境中Qsizeof(int)的取gؓ4?/p> <p>5. 指针变量的sizeof</p> <p>? q数据结构的你应该知道指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存攑֜址的,那么它当然等于计机内部地址ȝ的宽度。所以在32? 计算ZQ一个指针变量的q回值必定是4Q注意结果是以字节ؓ单位Q,可以预计Q在来?4位系l中指针变量的sizeofl果??/p> <div id="w6844kq" class="postCode"><font color="#0000ff">char</font>* pc = <font color="#ff00ff">"abc"</font>;<br><font color="#0000ff">int</font>* pi;<br><font color="#0000ff">string</font>* ps;<br><font color="#0000ff">char</font>** ppc = &pc;<br><font color="#0000ff">void</font> (*pf)(); <font color="#008000">// 函数指针</font><br><font color="#0000ff">sizeof</font>( pc ); <font color="#008000">// l果?</font><br><font color="#0000ff">sizeof</font>( pi ); <font color="#008000">// l果?</font><br><font color="#0000ff">sizeof</font>( ps ); <font color="#008000">// l果?</font><br><font color="#0000ff">sizeof</font>( ppc ); <font color="#008000">// l果?</font><br><font color="#0000ff">sizeof</font>( pf ); <font color="#008000">// l果?</font> </div> <p>指针变量的sizeofg指针所指的对象没有M关系Q正是由于所有的指针变量所占内存大相{,所以MFC消息处理函数使用两个参数WPARAM、LPARAMp传递各U复杂的消息l构Q用指向结构体的指针)?/p> <p>6. 数组的sizeof</p> <p>数组的sizeof值等于数l所占用的内存字节数Q如Q?/p> <div id="a8cims8" class="postCode"><font color="#0000ff">char</font> a1[] = <font color="#ff00ff">"abc"</font>;<br><font color="#0000ff">int</font> a2[3];<br><font color="#0000ff">sizeof</font>( a1 ); <font color="#008000">// l果?Q字W串末尾q存在一个NULLl止W?/font><br><font color="#0000ff">sizeof</font>( a2 ); <font color="#008000">// l果?*4=12Q依赖于intQ?/font><br></div> <p>一些朋友刚开始时把sizeof当作了求数组元素的个敎ͼ现在Q你应该知道q是不对的,那么应该怎么求数l元素的个数呢?EasyQ通常有下面两U写法:</p> <div id="m4ug4ci" class="postCode"><font color="#0000ff">int</font> c1 = <font color="#0000ff">sizeof</font>( a1 ) / <font color="#0000ff">sizeof</font>( <font color="#0000ff">char</font> ); <font color="#008000">// 总长?单个元素的长?/font><br><font color="#0000ff">int</font> c2 = <font color="#0000ff">sizeof</font>( a1 ) / <font color="#0000ff">sizeof</font>( a1[0] ); <font color="#008000">// 总长?W一个元素的长度</font> </div> <p>写到q里Q提一问,下面的c3Qc4值应该是多少呢?</p> <div id="4y4secw" class="postCode"><font color="#0000ff">void</font> foo3(<font color="#0000ff">char</font> a3[3])<br>{<br>    <font color="#0000ff">int</font> c3 = <font color="#0000ff">sizeof</font>( a3 ); <font color="#008000">// c3 == ?</font><br>}<br><font color="#0000ff">void</font> foo4(<font color="#0000ff">char</font> a4[])<br>{<br>    <font color="#0000ff">int</font> c4 = <font color="#0000ff">sizeof</font>( a4 ); <font color="#008000">// c4 == ?</font><br>} </div> <p>? 许当你试囑֛{c4的值时已经意识到c3{错了,是的Qc3!=3。这里函数参数a3已不再是数组cdQ而是蜕变成指针,相当于char* a3Qؓ什么?仔细x׃难明白,我们调用函数foo1ӞE序会在栈上分配一个大ؓ3的数l吗Q不会!数组?#8220;传址”的,调用者只需实参的地址? 递过去,所以a3自然为指针类型(char*Q,c3的g׃ؓ4?/p> <p>7. l构体的sizeof</p> <p>q是初学者问得最多的一个问题,所以这里有必要多费点笔墨。让我们先看一个结构体Q?/p> <div id="e4e8k4g" class="postCode"><font color="#0000ff">struct</font> S1<br>{<br>    <font color="#0000ff">char</font> c;<br>    <font color="#0000ff">int</font> i;<br>}; </div> <p>问sizeof(s1){于多少Q聪明的你开始思考了Qchar?个字节,int?个字节,那么加v来就应该?。是q样吗?你在你机器上试过了吗Q也怽是对的,但很可能你是错的QVC6中按默认讄得到的结果ؓ8?/p> <p>WhyQؓ什么受伤的L我? </p> <p>请不要沮丧,我们来好好琢一下sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节敎ͼ好吧Q那p我们来看看S1的内存分配情况:</p> <div id="ug88o44" class="postCode">S1 s1 = { 'a', 0xFFFFFFFF }; </div> <p>定义上面的变量后Q加上断点,q行E序Q观察s1所在的内存Q你发现了什么?</p> <p>以我的VC6.0ZQs1的地址?x0012FF78Q其数据内容如下Q?/p> <div id="wk884m4" class="postCode">0012FF78: 61 CC CC CC FF FF FF FF<br></div> <p>发现了什么?怎么中间Ҏ?个字节的CCQ看看MSDN上的说明Q?/p> <div id="88s4wa4" class="postRefrence">When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment.<br></div> <p>原来如此Q这是传说中的字节寚w啊!一个重要的话题出现了?/p> <p>? 什么需要字节对齐?计算机组成原理教导我们这h助于加快计算机的取数速度Q否则就得多花指令周期了。ؓ此,~译器默认会对结构体q行处理Q实际上其它? 方的数据变量也是如此Q,让宽度ؓ2的基本数据类型(short{)都位于能?整除的地址上,让宽度ؓ4的基本数据类型(int{)都位于能?整除? 地址上,以此cL。这P两个C间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了?/p> <p>让我们交换一下S1中char与int的位|:</p> <div id="484wygi" class="postCode"><font color="#0000ff">struct</font> S2<br>{<br>    <font color="#0000ff">int</font> i;<br>    <font color="#0000ff">char</font> c;<br>}; </div> <p>看看sizeof(S2)的结果ؓ多少Q怎么q是8Q再看看内存Q原来成员c后面仍然?个填充字节,q又是ؓ什么啊Q别着急,下面ȝ规律?/p> <p>字节寚w的细节和~译器实现相养I但一般而言Q满三个准则:</p> <div id="w4wc8s8" class="postConclusion">1) l构体变量的首地址能够被其最宽基本类型成员的大小所整除Q?br>2) l构体每个成员相对于l构体首地址的偏U量QoffsetQ都是成员大的整数倍,如有需要编译器会在成员之间加上填充字节Qinternal addingQ;<br>3) l构体的dؓl构体最宽基本类型成员大的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing paddingQ?br></div> <p>对于上面的准则,有几炚w要说明:</p> <p>1) 前面不是说结构体成员的地址是其大小的整数倍,怎么又说到偏U量了呢Q因为有了第1点存在,所以我们就可以只考虑成员的偏U量Q这h考v来简单。想想ؓ什么?br>l构体某个成员相对于l构体首地址的偏U量可以通过宏offsetof()来获得,q个宏也在stddef.h中定义,如下Q?/p> <div id="48c8gq4" class="postCode"><font color="#ff0000">#define</font> offsetof(s,m) (size_t)&(((s *)0)->m) </div> <p>例如Q想要获得S2中c的偏U量Q方法ؓ</p> <div id="eqys8ys" class="postCode">size_t pos = offsetof(S2, c); <font color="#008000">// pos{于4</font> </div> <p>2) 基本cd是指前面提到的像char、short、int、float、doubleq样的内|数据类型,q里所说的“数据宽度”是指其sizeof的大 。由于结构体的成员可以是复合cdQ比如另外一个结构体Q所以在L最宽基本类型成员时Q应当包括复合类型成员的子成员,而不是把复合成员看成是一个整 体。但在确定复合类型成员的偏移位置时则是将复合cd作ؓ整体看待?/p> <p>q里叙述h有点拗口Q思考v来也有点挠头Q还是让我们看看例子吧(具体数g以VC6ZQ以后不再说明)Q?/p> <div id="ywa884c" class="postCode"><font color="#0000ff">struct</font> S3<br>{<br>    <font color="#0000ff">char</font> c1;<br>    S1 s;<br>    <font color="#0000ff">char</font> c2<br>}; </div> <p>S1的最宽基本成员的cd为intQS3在考虑最宽基本类型成员时是将S1“打散”看的Q所以S3的最宽基本类型ؓintQ这P通过S3定义的变量,其存储空间首地址需要被4整除Q整个sizeof(S3)的g应该?整除?/p> <p>c1 的偏U量?Qs的偏U量呢?q时s是一个整体,它作为结构体变量也满_面三个准则,所以其大小?Q偏U量?Qc1与s之间侉K?个填充字节,? c2与s之间׃需要了Q所以c2的偏U量?2Q算上c2的大ؓ13Q?3是不能被4整除的,q样末尾q得补上3个填充字节。最后得到sizeof (S3)的gؓ16?/p> <p>通过上面的叙qͼ我们可以得到一个公式:</p> <div id="q4ye84a" class="postConclusion">l构体的大小{于最后一个成员的偏移量加上其大小再加上末填充字节数目Q即Q?br>sizeof( struct ) = offsetof( last item ) + sizeof( last item ) + sizeof( trailing padding )</div> <p>? q里Q朋友们应该对结构体的sizeof有了一个全新的认识Q但不要高兴得太早,有一个媄响sizeof的重要参量还未被提及Q那便是~译器的pack? 令。它是用来调整结构体寚w方式的,不同~译器名U和用法略有不同QVC6中通过#pragma pack实现Q也可以直接修改/Zp~译开兟?pragma pack的基本用法ؓQ?pragma pack( n )Qn为字节对齐数Q其取gؓ1????6Q默认是8Q如果这个值比l构体成员的sizeof值小Q那么该成员的偏U量应该以此gؓ准,x_ l构体成员的偏移量应该取二者的最|公式如下Q?/p> <div id="cs4qsik" class="postConclusion">offsetof( item ) = min( n, sizeof( item ) )<br></div> <p>再看CZQ?/p> <div id="8eka6oi" class="postCode"><font color="#ff0000">#pragma</font> pack(<font color="#0000ff">push</font>) <font color="#008000">// 当前pack讄压栈保存</font><br><font color="#ff0000">#pragma</font> pack(2) <font color="#008000">// 必须在结构体定义之前使用</font><br><font color="#0000ff">struct</font> S1<br>{<br>    <font color="#0000ff">char</font> c;<br>    <font color="#0000ff">int</font> i;<br>};<br><font color="#0000ff">struct</font> S3<br>{<br>    <font color="#0000ff">char</font> c1;<br>    S1 s;<br>    <font color="#0000ff">char</font> c2<br>};<br><font color="#ff0000">#pragma</font> pack(<font color="#0000ff">pop</font>) <font color="#008000">// 恢复先前的pack讄</font> </div> <p>计算sizeof(S1)Ӟmin(2, sizeof(i))的gؓ2Q所以i的偏U量?Q加上sizeof(i){于6Q能够被2整除Q所以整个S1的大ؓ6?/p> <p>同样Q对于sizeof(S3)Qs的偏U量?Qc2的偏U量?Q加上sizeof(c2){于9Q不能被2整除Q添加一个填充字节,所以sizeof(S3){于10?/p> <p>现在Q朋友们可以L的出一口气了,:)</p> <p>q有一点要注意Q?#8220;I结构体”Q不含数据成员)的大不?Q而是1。试想一?#8220;不占I间”的变量如何被取地址、两个不同的“I结构体”变量又如何得以区分呢Q于是,“I结构体”变量也得被存储,q样~译器也只能ؓ其分配一个字节的I间用于占位了。如下:</p> <div id="4c44o4a" class="postCode"><font color="#0000ff">struct</font> S5 { };<br><font color="#0000ff">sizeof</font>( S5 ); <font color="#008000">// l果?</font> </div> <p>8. 含位域结构体的sizeof</p> <p>前面已经说过Q位域成员不能单独被取sizeof|我们q里要讨论的是含有位域的l构体的sizeofQ只是考虑到其Ҏ性而将其专门列了出来?/p> <p>C99规定int、unsigned int和bool可以作ؓ位域cdQ但~译器几乎都Ҏ作了扩展Q允许其它类型类型的存在?/p> <p>使用位域的主要目的是压羃存储Q其大致规则为:</p> <div id="s6eqwwg" class="postConclusion">1) 如果盔R位域字段的类型相同,且其位宽之和于cd的sizeof大小Q则后面的字D将紧邻前一个字D存储,直到不能容纳为止Q?br>2) 如果盔R位域字段的类型相同,但其位宽之和大于cd的sizeof大小Q则后面的字D将从新的存储单元开始,其偏U量为其cd大小的整数倍;<br>3) 如果盔R的位域字D늚cd不同Q则各编译器的具体实现有差异QVC6采取不压~方式,Dev-C++采取压羃方式Q?br>4) 如果位域字段之间I插着非位域字D,则不q行压羃Q?br>5) 整个l构体的dؓ最宽基本类型成员大的整数倍?/div> <p>q是让我们来看看例子?/p> <p>CZ1Q?/p> <div id="iq88448" class="postCode"><font color="#0000ff">struct</font> BF1<br>{<br>    <font color="#0000ff">char</font> f1 : 3;<br>    <font color="#0000ff">char</font> f2 : 4;<br>    <font color="#0000ff">char</font> f3 : 5;<br>}; </div> <p>其内存布局为:</p> <pre class="postGraph">| f1 | f2 | | f3 | |---------------------------------| | | | | | | | | | | | | | | | |---------------------------------0 3 7 8 13 16 (byte)</pre> <p>位域cd为charQ第1个字节仅能容U下f1和f2Q所以f2被压~到W?个字节中Q而f3只能从下一个字节开始。因此sizeof(BF1)的结果ؓ2?/p> CZ2Q?br> <div id="sg4myw8" class="postCode"><font color="#0000ff">struct</font> BF2<br>{<br>    <font color="#0000ff">char</font> f1 : 3;<br>    <font color="#0000ff">short</font> f2 : 4;<br>    <font color="#0000ff">char</font> f3 : 5;<br>}; </div> <p>׃盔R位域cd不同Q在VC6中其sizeof?Q在Dev-C++中ؓ2?/p> CZ3Q?br> <div id="gay8444" class="postCode"><font color="#0000ff">struct</font> BF3<br>{<br>    <font color="#0000ff">char</font> f1 : 3;<br>    <font color="#0000ff">char</font> f2;<br>    <font color="#0000ff">char</font> f3 : 5;<br>}; </div> <p>非位域字D늩插在其中Q不会生压~,在VC6和Dev-C++中得到的大小均ؓ3?/p> <p>9. 联合体的sizeof</p> <p>l构体在内存l织上是序式的Q联合体则是重叠式,各成员共享一D内存,所以整个联合体的sizeof也就是每个成员sizeof的最大倹{结构体的成员也可以是复合类型,q里Q复合类型成员是被作为整体考虑的?/p> <p>所以,下面例子中,U的sizeof值等于sizeof(s)?/p> <div id="q44s4c4" class="postCode"><font color="#0000ff">union</font> U<br>{<br>    <font color="#0000ff">int</font> i;<br>    <font color="#0000ff">char</font> c;<br>    S1 s;<br>}; </div> </div> <br><img src ="http://m.shnenglu.com/paladino/aggbug/26578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/paladino/" target="_blank">Gu.paladino</a> 2007-06-18 18:26 <a href="http://m.shnenglu.com/paladino/articles/26578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学C++时要注意?/title><link>http://m.shnenglu.com/paladino/articles/26181.html</link><dc:creator>Gu.paladino</dc:creator><author>Gu.paladino</author><pubDate>Tue, 12 Jun 2007 09:13:00 GMT</pubDate><guid>http://m.shnenglu.com/paladino/articles/26181.html</guid><wfw:comment>http://m.shnenglu.com/paladino/comments/26181.html</wfw:comment><comments>http://m.shnenglu.com/paladino/articles/26181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/paladino/comments/commentRss/26181.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/paladino/services/trackbacks/26181.html</trackback:ping><description><![CDATA[q个写的一定是q来的h啊,不收藏对不v自己Q?br><br>1.把C++当成一门新的语a学习Q和C没啥关系Q真的。)Q?br>2.看《Thinking In C++》,不要看《C++变成ȝ》;<br>3.看《The C++ Programming Language》和《Inside The C++ Object Model?不要因ؓ他们很难而我们自己是初学者所以就不看Q?br>4.不要被VC、BCB、BC、MC、TC{词汇所qh——他们都是集成开发环境,而我们要学的是一门语aQ?br>5.不要放过M一个看上去很简单的编E问题——他们往往q不那么单,或者可以引伸出很多知识点;<br>6.会用Visual C++Qƈ不说明你会C++Q?br>7.学classq不难,template、STL、generic programming也不q如此——难的是长期坚持实践和不遗余力的博览书Q?br>8.如果不是天才的话Q想学编E就不要想玩游戏——你以ؓ你做CQ其实你的C++水^q没有和你通关的能力一起变高——其实可以时刻记住:学C++是ؓ了编游戏的;<br>9.看Visual C++的书Q是学不了C++语言的;<br>10.躁的hҎ_XX语言不行了,应该学YYQ——是你自׃行了吧!Q?br>11.躁的hҎ问:我到底该学什么;——别问,学就对了Q?br>12.躁的hҎ问:XX有钱途吗Q——徏议你L银行Q?br>13.躁的hҎ_我要中文版!我英文不行!——不行?学呀Q?br>14.躁的hҎ问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;<br>15.躁的h分两U:a)只观望而不学的人;b)只学而不坚持的hQ?br>16.把时髦的技术挂在嘴边,q不如把q时的技术记在心里;<br>17.C++不仅仅是支持面向对象的程序设计语aQ?br>18.学习~程最好的Ҏ之一是阅读源代码;<br>19.在Q何时刻都不要认ؓ自己手中的书已经_了;<br>20.请阅诅RThe Standard C++ Bible?中文版:标准C++宝典)Q掌握C++标准Q?br>21.看得懂的书,请仔l看Q看不懂的书Q请着头皮看;<br>22.别指望看W一遍书pC和掌握什么——请看第二遍、第三遍Q?br>23.L《Effective C++》和《More Effective C++》以及《Exceptional C++》;<br>24.不要停留在集成开发环境的摇篮上,要学会控刉成开发环境,q要学会用命令行方式处理E序Q?br>25.和别Z赯论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;<br>26.L《程序设计实c,q严格的按照其要求去做;<br>27.不要因ؓC和C++中有一些语法和关键字看上去相同Q就认ؓ它们的意义和作用完全一P<br>28.C++l不是所谓的C?#8220;扩充”——如果C++一开始就起名叫Z语言Q你一定不会把C和Z语言联系得那么紧密;<br>29.请不要认为学qXX语言再改学C++会有什么问题——你只不q又在学一门全新的语言而已Q?br>30.d了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++Q?br>31.学习~程的秘诀是:~程Q编E,再编E;<br>32.L意下列书c:《C++面向对象高效~程QC++ Effective Object-Oriented Software ConstructionQ》《面向对象Y件构?Object-Oriented Software Construction)》《设计模式(Design PatternsQ》《The Art of Computer Programming》;<br>33.CQ面向对象技术不只是C++专有的;<br>34.h书上的程序例子亲手输入到电脑上实践,即配套光盘中有源代码;<br>35.把在书中看到的有意义的例子扩充;<br>36.请重视C++中的异常处理技术,q将其切实的q用到自qE序中;<br>37.l常回顾自己以前写过的程序,q尝试重写,把自己学到的新知识运用进去;<br>38.不要漏掉书中M一个练习题——请全部做完q记录下解题思\Q?br>39.C++语言和C++的集成开发环境要同时学习和掌握;<br>40.既然军_了学C++,p坚持学下去,因ؓ学习E序设计语言的目的是掌握E序设计技术,而程序设计技术是跨语a的;<br>41.pC++语言的各U^台和开发环境去Ȁ烈的竞争吧,我们要以学习C++语言本nZQ?br>42.当你写C++E序写到一半却发现自己用的Ҏ很拙劣时Q请不要马上停手Q请快余下的部分_略的完成以保证q个设计的完整性,然后分析自己的错误ƈ重新设计和编写(参见43Q;<br>43.别心急,设计C++的class实不容易;自己E序中的class和自qclass设计水^是在不断的编E实践中完善和发展的Q?br>44.决不要因为程?#8220;很小”׃遵@某些你不熟练的规则——好习惯是培d来的Q而不是一ơ记住的Q?br>45.每学C个C++隄的时候,试着对别解这个知识点q让他理解——你能讲清楚才说明你真的理解了;<br>46.记录下在和别Z时发现的自己忽视或不理解的知识点;<br>47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XXQ?br>48.保存好你写过的所有的E序——那是你最好的U篏之一Q?br>49.请不要做躁的hQ?br>50.L爱C++! <br><img src ="http://m.shnenglu.com/paladino/aggbug/26181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/paladino/" target="_blank">Gu.paladino</a> 2007-06-12 17:13 <a href="http://m.shnenglu.com/paladino/articles/26181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++资源导引http://m.shnenglu.com/paladino/articles/25664.htmlGu.paladinoGu.paladinoWed, 06 Jun 2007 08:44:00 GMThttp://m.shnenglu.com/paladino/articles/25664.htmlq文章太ZQ我一定要收藏Q对不v自己Q?/span>

--------------------------------------------------------------------------------

  1Q前a

  无数ơ听?#8220;我要开始学习C++!”的呐喊,无数ơ听?#8220;C++太复杂了Q我真的
学不?#8221;的无奈。Stan Lippman先生曑֜《C++ Primer》一书中指出“C++是最为难
学的高E序设计语言之一”Qh们常?#8220;之一”L以表达自己对C++的敬畏。诚
ӞC++E序设计语言对于学习者的有很多难以逾越的`沟,体系l构的庞大,?br>接不暇ƈ不断扩充的特?#8230;…除此之外Q参考资料之多与冗杂使它的学习者望而却
步,Ʋ求深入者苦不堪a。希望这一份不完全导引能够成ؓ您C++学习之\上的引\
灯?br>
  撰写本文的初衷ƈ不打带领大家体验古老的C++历史Q如果你想了解C++的历
史与其前期发展中诸多技术的演变Q你应当d考Bjarne的《The Design and Evo
lution of C++》。当然也不打给大家一个无所不包的宝典(q不想Q其一是因
水^有限Q其二无奈C++之博大精深)Q所l出的仅仅是一些我们认为对于想学习C
++的广大读者来说最重要q且触手可及的开发与学习资源?br>
  本文介绍q分析了一些编译器Q开发环境,库,量的书c以及参考网站,q?br>且尽可能试着l出一个利用这些资源的导引Q望对如同我们一L初学者能够有
所裨益?br>
------------------------------------------------------------------------
--------

  2Q编译器

  在C++之外的Q何语a中,~译器都从来没有受到q如此之重视。因为C++是一
门相当复杂的语言Q所以编译器也难于构建。直到最q我们才开始能够用上完全
W合C++标准的编译器Q哦Q你可能会责怪那些编译器厂商不能早的提供符合标?br>的编译器Q这只能怪他们各自维pȝ自n的一套别Z愿接受的标准Q。什么??br>说这无关紧要Q哦Q不Q你所需要的是和标准化C++高度兼容的编译环境。长q来?br>Q只有这L~译器对C++开发h员来说才是最有意义的工具Q尤其是对于E序设计
语言的学习者。一x让代码具备可移植性,q让一门语a及其库的应用更ؓq泛
。嗯Q是的,我们q里只打介l一些公认的优秀~译器?br>
  2.1 Borland C++

  q个是Borland C++ Builder和Borland C++ Builder Xq两U开发环境的后台
~译器。(哦,我之所以将之分ZU开发环境你应当能明白ؓ什么,正如Delphi
7到Delphi8的{变,是革命性的两代。)Borland C++p牌开发工具厂商Borland
們֊打造。该公司的编译器素以速度快,I间效率高著UͼBorland C++ pd~译
器秉承了q个传统Q属于非怼质的~译器。标准化斚w早在5.5版本的编译器中对
标准化C++的兼容就辑ֈ?2.73%。目前最新版本是Borland C++ Builder X中的6.
0版本Q官方称100%W合ANSI/ISO的C++标准以及C99标准。嗯…q正是我前面所指的
“完全W合C++标准的编译器”?br>
  2.2 Visual C++

  q个正是我们熟知的Visual Studio ?Visual Studio.net 2002, 2003以及2
005 Whidbey中带的C++~译器。由Microsoft公司研制。在Visual Studio 6.0中,
因ؓ~译器有太多地方不能与后来出现的C++标准相吻合而饱受批评(x你在使用
STL的时候编译时报出的那些o人厌恶的error和warning吧)。VC++6.0Ҏ准化C+
+的兼容只?3.43%。但是随着C++~译器设计大师Stanley Lippman以及诸多C++C?br>达人的加盟Q在Visual Studio.NET 2003中,Visual C++~译器已l成Z个非
常成熟可靠的C++~译器了。Dr.Dobb's Journal的评显CVisual C++7.1Ҏ准C
++的兼Ҏ高?8.22%Q一度成为CBX之前兼容性最好的~译器。结合强大的Visua
l Studio.NET开发环境,是一个非怸错的选择。至于Whidbey时代的Visual C++,
g微Y所最x的是C++/CLI……我们不想评论微Y下一代的C++~译器对标准?br>兼容如何Q但他确实越来越适合.NET (其实你和我的感觉可能是一LQ微软不?br>当把标准C++q块肥肉丢给Borland,然而微软可能ƈ不这栯??br>
  2.3 GNU C++

  著名的开源C++~译器。是cUnix操作pȝ下编写C++E序的首选。特Ҏ有非
常好的移植性,你可以在非常q泛的^C使用它,同时也是~写跨^収ͼ嵌入?br>E序很好的选择。另外在W合标准q个斚w一直都非常好,GCC3.3大概能够辑ֈ96
.15%。但是由于其跨^台的Ҏ,在代码尺寔R度{优化上略微差一炏V?br>
  ZGNU C++的编译器有很多,比如Q?br>
  (1) Mingw

  http://www.mingw.org/

  GCC的一个Windows的移植版本(Dev-C++的后収ͼ

  (2) Cygwin

  http://sources.redhat.com/cygwin/

  GCC的另外一个WindowsUL版本是Cygwin的一部分QCygwin是Windows下的一?br>Unix仿真环境。严格的说是模拟GNU的环境,q也是"Gnu's Not Unix"要表辄?br>思,噢,扯远了,qƈ不是我们在这里关心的实质内容?br>
  (3) Djgpp

  http://www.delorie.com/djgpp/

  q是GCC的DOSUL版本?br>
  (4) RSXNT

  http://www.mathematik.uni-bielefeld.de/~rainer/

  q是GCC的DOS和WindowsUL版本?br>
  (5) Intel C++

  著名CPU刉厂商Intel出品的编译器QSpecial Design for Intel x86Q对?br>Intel x86l构的CPUl过特别的优化。在有些应用情况下,特别是数D等高?br>能应用,仅仅采用Intel的编译器~译p大幅度的提高性能?br>
  (6) Digital Mars C++

  |络上提供免费下载,Zortech/Symantec C++的承者,其前w在当年惨烈?br>C++四国战中也是主角之一?br>
------------------------------------------------------------------------
--------

  3Q开发环?br>
  开发环境对于程序员的作用不a而喻。选择自己朝夕相处的环境也不是Ҏ?br>事情Q特别是在IDE如此丰富的情况下。下面就是我们推荐的一些常见的C++开发环
境,q没有包括一些小型的Q罕见的IDE。其中Q何一N是功能丰富,可以用作?br>常开发用的。对于不同层面的开发者,请参见内文关于适用对象的描q?br>
  3.1 Visual Studio 6.0

  q个虽然是Microsoft公司的老版本的开发环境,但是鉴于其后l版本Visual
Studio.NET的庞大nw,以及初学者ƈ不那么高的功能要求,所以推荐这个开发环
境给C++的初学者,供其学习C++的最基本的部分,比如C的那部分子集Q当然你别指
望他能够支持最新的C99标准。在日常的开发中Q仍然有很多公司使用q个l典E_
的环境,比如W者就看曾亲见有些公司其~译器替换ؓGCC做手机开发之用?br>
  3.2 Visual Studio.NET 2003

  作ؓMicrosoft公司官方正式发布的最新版本开发环境,其中有太多激动h心的
功能。结合其最新的C++~译器。对于机器配|比较好的开发h员来_使用q个开
发环境将能满_大部分的要求。这里不打算单独说Visual Studio Whidbey,虽然
Visual Studio .NET 2005 - WhidbeyC֌预览版已l推出,但暂不是很稳定,读?br>可以亲nM验?br>
  3.3 Borland C++ Builder 6

  q个q不是Borland的C++开发环境的最新版本。选择它的原因是它不是用Java
写的IDEQ速度比较快。它有一个很完善的GUIH体设计器,和Delphiq一个VCL?br>׃q些特点Q比较适合初学者上手。但是由于其GUI的中心位|,可能不利于对?br>C++语言的学习。而且其ؓ了支持VCLq个Object Pascal写的库也对C++q行了一?br>U有的扩充。得h们有一个不得不接受的事实:“Borland C++ Builder 6的高?br>几乎都是Delphi高手”?br>
  3.4 Borland C++ Builder X

  正如前文所qͼ虽然版本号上和前面那个IDE非常相象Q但是其实它们是完全?br>同的两个集成开发环境。C++Builder更多的是一个和Delphi同步的C++版本的开发环
境,C++BuilderX则是完全从C++的角度思考得出的一个功能丰富的IDE。其最大的?br>Ҏ跨^収ͼ跨编译器Q多UFramework的集成,q且有一个WxWindows为基的GU
I设计器。尤其是采用了纯C++来重写了整个Framework,摒弃了以前o人无奈的版本
。对于C++的开发来_从编译器Q到库,到功能集成都是非常理想的。可以预见,
Borland C++ Builder X 2.0很值得C++爱好者期待。唯一令h隑֠之处是作Z?br>C++的开发工P其IDE是用Java写的Q在配置不够理想的机器上h重考虑再安?br>?br>
  3.5 Emacs + GCC

  前面讲的大部分是Windows环境下的集成开发环境。Linux上的开发者更們֐?br>使用Emacs来编辑C++的文Ӟ用Makefile来命令GCC做编译。虽然看上去比较松散Q?br>但是q些东西l合hq是一个开0发环境。如果你能够娴熟的用这L环境写程
序,你的水^应该_指导我们来写q篇陋文了?br>
  3.6 Dev C++

  GCC是一个很好的~译器。在Windows上的C++~译器一直和标准有着一D距ȝ
时候,GCC是一个让Windows下开发者流口水的编译器。Dev-C++是能够让GCC?br>在Windows下的工具Q作为集成开发环境,q提供了同专业IDE相媲的语法高亮Q?br>代码提示Q调试等功能。由于用Delphi开发,占用内存,速度很快Q比较适合
轻量U的学习和用?br>
  3.7 Eclipse + CDT

  Eclipse可是q来大名鼎鼎的开发工兗最C期的Jolt大奖颁l了q个杰出
的神物。说其神奇是因ؓQ它本n是用Java写的Q但是拥有比一般Java写的E序?br>得多的速度。而且因ؓ其基于插件组装一切的原则Q得能够有CDTq样的插件把E
clipse变成一个C/C++的开发环境。如果你一直用Eclipse写Java的程序,不妨用它
体验一下C++开发的乐趣?br>
------------------------------------------------------------------------
--------

  4Q工?br>
  C++的辅助工L多,我们分门别类的ؓ大家作介l:

  4.1 文档c?br>
  (1) Doxygen

  参考站点:http://www.doxygen.org

  Doxygen是一U适合C风格语言Q如C++、C、IDL、Java甚至包括C#和PHPQ的?br>开放源码的、基于命令行的文档生器?br>
  (2) C++2HTML

  参考站点:http://www.bedaux.net/cpp2html/

  把C++代码变成语法高亮的HTML

  (3) CodeColorizer

  参考站点:http://www.chami.com/colorizer/

  它能把好几种语言的源代码着色ؓHTML

  (4) Doc-O-Matic

  参考站点:http://www.doc-o-matic.com/

  Doc-O_MaticZ的C/C++QC++.netQDelphi/Pascal, VB.NETQC#和JavaE序
或者组件生准的文档。Doc-O-Matic使用源代码中的符号和注释以及外部的文?br>文g创徏与流行的文档样式一致的文档?br>
  (5) DocVizor

  参考站点:http://www.ucancode.net/Products/DocBuilder/Features.htm

  DocVizor满了面向对象Y件开发者的基本要求——它让我们能够看到C++工程
中的cdơ结构。DocVizor快速地产生完整可供打印的类层次l构图,包括从第?br>方库中来的那些类Q除此之外DocVizorq能从类信息中生HTML文g?br>
  (6) SourcePublisher C++

  参考站点:http://www.scitools.com/sourcepublisher_c.html

  l源代码产生提供快速直观的HTML报表Q包括代码,cdơ结构,调用和被?br>用树Q包含和被包含树。支持多U操作系l?br>
  (7) Understand

  参考站点:http://www.scitools.com/ucpp.html

  分析M规模的C或者C++工程Q帮助我们更好的理解以及~写文档?br>
  4.2 代码c?br>
  (1) CC-Rider

  参考站点:http://www.cc-rider.com

  CC-Rider是用于C/C++E序强大的代码可视化工具Q通过交互式浏览、编辑及?br>动文件来促进E序的维持和发展?br>
  (2) CodeInspect

  参考站点:http://www.yokasoft.com/

  一U新的C/C++代码分析工具。它查我们的源代码找出非标准的,可能的,?br>及普通的错误代码?br>
  (3) CodeWizard

  参考站点:http://www.parasoft.com

  先进的C/C++源代码分析工P使用过500个编码规范自动化地标明危险的Q?br>但是~译器不能检查到的代码结构?br>
  (4) C++ Validation Test Suites

  参考站点:http://www.plumhall.com/suites.html

  一l用于测试编译器和库对于标准dE度的代码库?br>
  (5) CppRefactory

  参考站点:http://cpptool.sourceforge.net/

  CPPRefactory是一个得开发者能够重构他们的C++代码的程序。目的是使得C
++代码的重构能够尽可能的有效率和简单?br>
  (6) Lzz

  参考站点:http://www.lazycplusplus.com/

  Lzz是一个自动化许多C++~程中的体力zȝ工具。它能够节省我们许多事gq?br>且得编码更加有乐趣。给Zpd的声明,Lzz会给我们创徏头文件和源文件?br>
  (7) QA C++ Generation 2000

  参考站点:http://www.programmingresearch.com/solutions/qacpp.htm

  它关注面向对象的C++源代码,Ҏ关于设计Q效率,可靠性,可维护性的部分
提出警告信息?br>
  (8) s-mail project - Java to C++DOL

  参考站点:http://sadlocha.strefa.pl/s-mail/ja2dol.html

  把Java源代码翻译ؓ相应的C++源代码的命o行工兗?br>
  (9) SNIP from Cleanscape Software International

  参考站点:http://www.cleanscape.net/stdprod/snip/index.html

  一个填q编码和设计之间沟壑的易于用的C++开发工P节省大量~辑和调?br>的事Ӟ它还使得开发者能够指定设计模式作为对象模型,自动从对象模型中产生
C++的类?br>
  (10) SourceStyler C++

  参考站点:http://www.ochresoftware.com/

  对C/C++源代码提供完整的格式化和排版控制的工兗提供多?5个的格式化?br>以及完全支持ANSI C++?br>
  4.3 ~译c?br>
  (1) Compilercache

  参考站点:http://www.erikyyy.de/compilercache/

  Compilercache是一个对你的C和C++~译器的装脚本。每ơ我们进行编译,?br>装脚本,把编译的l果攑օ~存Q一旦编译相同的东西Q结果将从缓存中取出而不
是再ơ编译?br>
  (2) Ccache

  参考站点:http://ccache.samba.org/

  Ccache是一个编译器~存。它使用h像C/C++~译器的~存预处理器Q编?br>速度通常能提高普通编译过E的5~10倍?br>
  (3) Cmm (C++ with MultiMethods)

  参考站点:http://www.op59.net/cmm/cmm-0.28/users.html

  q是一UC++语言的扩展。读入Cmm源代码输出C++的源代码Q功能是对C++语言
d了对multimethod的支持?br>
  (4) The Frost Project

  参考站点:http://frost.flewid.de/

  Forst使得你能够在C++E序中像原生的C++Ҏ一样用multimethod以及虚函
数参数。它是一个编译器的外壟?br>
  4.4 试和调试类

  (1) CPPUnit

  CppUnit 是个Z LGPL 的开源项目,最初版本移植自 JUnitQ是一个非怼
U的开源测试框架。CppUnit ?JUnit 一样主要思想来源于极限编E。主要功能就
是对单元试q行理Qƈ可进行自动化试?br>
  (2) C++Test

  参考站点:http://www.parasoft.com/

  C++ Test是一个单元测试工P它自动化了C和C++c,函数或者组件的试?br>

  (3) Cantata++

  参考站点:http://www.iplbath.com/products/tools/pt400.shtml

  设计的目的是Z满在合理的l济开销下用这个工具可以让开发工E师开
展单元测试和集成试的需?

  (4) Purify

  参考站点:http://www-900.ibm.com/cn/software/rational/products/purif
yplus/index.shtml

  IBM Rational PurifyPlus是一套完整的q行时分析工P旨在提高应用E序?br>可靠性和性能。PurifyPlus内存错误和泄漏、应用程序性能描述、代码覆?br>分析{功能组合在一个单一、完整的工具包中?br>
  (5) BoundsChecker

  BoundsChecker是一个C++q行旉误检和调试工具。它通过在Visual Studi
o内自动化调试q程加速开发ƈ且羃短上市的周期。BoundsChecker提供清楚Q详l?br>的程序错误分析,许多是对C++独有的ƈ且在staticQstack和heap内存中检和?br>断错误,以及发现内存和资源的泄漏。  (6) Insure++

  参考站点:http://www.parasoft.com/

  一个自动化的运行时E序试工具Q检查难以察觉的错误,如内存覆盖,内存?br>漏,内存分配错误Q变量初始化错误Q变量定义冲H,指针错误Q库错误Q逻辑?br>误和法错误{?br>
  (7) GlowCode

  参考站点:http://www.glowcode.com/

  GlowCode包括内存泄漏查,code profilerQ函数调用跟t等功能。给C++开
发者提供完整的错误诊断Q和q行时性能分析工具包?br>
  (8) Stack Spy

  参考站点:http://www.imperioustech.com/

  它能捕捉stack corruption, stack over run, stack overflow{有x的错
误?br>
------------------------------------------------------------------------
--------

  5Q库

  在C++中,库的C是非帔R的。C++之父 Bjarne Stroustrup先生多次表示?br>设计库来扩充功能要好q设计更多的语法的言论。现实中QC++的库门类J多Q解?br>的问题也是极其广泛,库从轻量U到重量U的都有。不都是让人眼界大开Q亦?br>是望而生叹的思维C。由于库的数量非常庞大,而且限于W者水qI其中很多q?br>不了解。所以文中所提的一些库都是比较著名的大型库?br>
  5.1 标准?br>
  标准库中提供了C++E序的基本设施。虽然C++标准库随着C++标准折腾了许多年
Q直到标准的出台才正式定型,但是在标准库的实C却很令hƣ慰得看到多U实
玎ͼq且已被实践证明为有工业U别强度的佳作?br>
  (1) Dinkumware C++ Library

  参考站点:http://www.dinkumware.com/

  P.J. Plauger~写的高品质的标准库。P.J. Plauger博士是Dr. Dobb'sE序?br>计杰出奖的获得者。其~写的库长期被Microsoft采用Qƈ且最qBorland也取得了
其OEM的licenseQ在其C/C++的品中采用Dinkumware的库?br>
  (2) RogueWave Standard C++ Library

  参考站点:http://www.roguewave.com/

  q个库在Borland C++ Builder的早期版本中曄被采用,后来被其他的库给?br>换了。笔者不推荐使用?br>
  (3) SGI STL

  参考站点:http://www.roguewave.com/

  SGI公司的C++标准模版库?br>
  (4) STLport

  参考站点:http://www.stlport.org/

  SGI STL库的跨^台可UL版本?br>
  5.2 “?#8221;标准?- Boost

  参考站点:http://www.boost.org

  国内镜像Qhttp://www.c-view.org/tech/lib/boost/index.htm

  Boost库是一个经q千锤百点{可UL、提供源代码的C++库,作ؓ标准库的?br>备,是C++标准化进E的发动Z一?Boost库由C++标准委员会库工作l成员发?br>Q在C++C֌中媄响甚大,其成员已q?000人?Boost库ؓ我们带来了最新、最酗?br>最实用的技术,是不折不扣的“?#8221;标准库?br>
  Boost中比较有名气的有q么几个库:

  Regex

  正则表达式库

  Spirit

  LL parser frameworkQ用C++代码直接表达EBNF

  Graph

  囄件和法

  Lambda

  在调用的地方定义短小匿名的函数对象,很实用的functional功能

  concept check

  查泛型编E中的concept

 

  Mpl

  用模板实现的元编E框?br>
 

  Thread

  可移植的C++多线E库

 

  Python

  把C++cd函数映射到Python之中

  Pool

  内存池管?br>
 

  smart_ptr

  5个智能指针,学习指针必读Q一份不错的参考是来自CUJ的文章:

  Smart Pointers in BoostQ哦Q这文章可以查刎ͼCUJ是提供在U浏览的?br>中文版见W者在《Dr. Dobb's Journal软g研发杂志》第7辑上的译文?br>
  BoostM来说是实用h值很高,质量很高的库。ƈ且由于其对跨q_的强调,
Ҏ准C++的强调,是编写^台无养ICC++的开发者必备的工具。但是Boost中也
有很多是实验性质的东西,在实际的开发中实用需要}慎。ƈ且很多Boost中的库功
能堪U对语言功能的扩展,其构造用精巧的手法Q不要N然的p旉研读。Bo
ost另外一面,比如Graphq样的库则是h工业强度Q结构良好,非常值得研读?br>_֓代码Qƈ且也可以攑ֿ的在产品代码中多多利用?br>
  5.3 GUI

  在众多C++的库中,GUI部分的库是比较J荣Q也比较引h注目的。在实际开
发中QGUI库的选择也是非常重要的一件事情,下面我们lD一下可选择的GUI库,
各自的特点以及相兛_L支持?br>
  (1) MFC

  大名鼎鼎的微软基cdQMicrosoft Foundation ClassQ。大凡学qVC++?br>人都应该知道q个库。虽然从技术角度讲QMFC是不大漂亮的Q但是它构徏于Windo
ws API 之上Q能够ɽE序员的工作更容?~程效率高,减少了大量在建立 Windo
ws E序时必ȝ写的代码Q同时它q提供了所有一?C++ ~程的优点,例如l承
和封装。MFC ~写的程序在各个版本的Windows操作pȝ上是可移植的Q例如,?br>Windows 3.1下编写的代码可以很容易地UL?Windows NT ?Windows 95 上。但
是在最q发展以及官Ҏ持上日渐势微?br>
  (2) QT

  参考网站:http://www.trolltech.com/

  Qt是Trolltech公司的一个多q_的C++囑Ş用户界面应用E序框架。它提供l?br>应用E序开发者徏立艺术的图形用L面所需的所用功能。Qt是完全面向对象的
很容易扩展,q且允许真正地组件编E。自?996q早些时候,Qtq入商业领域Q?br>它已l成为全世界范围内数千种成功的应用程序的基础。Qt也是行的Linux桌面?br>境KDE 的基Q同时它q支持Windows、Macintosh、Unix/X11{多U^台?br>
  (3) WxWindows

  参考网站:http://www.wxwindows.org/

  跨^台的GUI库。因为其cdơ极像MFCQ所以有文章介绍从MFC到WxWindows?br>代码UL以实现跨q_的功能。通过多年的开发也是一个日完善的GUI库,支持?br>样不׃前面两个库。ƈ且是完全开放源代码的。新q的C++ Builder X的GUI设计
器就是基于这个库的?br>
  (4) Fox

  参考网站:http://www.fox-toolkit.org/

  开放源代码的GUI库。作者从自己亲n的开发经验中得出了一个理想的GUI库应
该是什么样子的感受出发Q从而开始了对这个库的开发。有兴趣的可以尝试一下?br>

  (5) WTL

  ZATL的一个库。因Z用了大量ATL的轻量手法Q模板等技术,在代码尺
寸,以及速度优化斚w做得非常C。主要面向的使用体是开发COM轻量U供|络
下蝲的可视化控g的开发者?br>
  (6) GTK

  参考网站:http://gtkmm.sourceforge.net/

  GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnomeq样的杀手应用?br>而GTK是q个库的C++装版本?br>
  5.4 |络通信

  (1) ACE

  参考网站:http://www.cs.wustl.edu/~schmidt/ACE.html

  C++库的代表Q超重量U的|络通信开发框架。ACE自适配通信环境QAdaptive
 Communication EnvironmentQ是可以自由使用、开放源代码的面向对象框Ӟ?br>其中实现了许多用于ƈ发通信软g的核心模式。ACE提供了一l丰富的可复用C++?br>装外观(Wrapper FacadeQ和框架lgQ可跨越多种q_完成通用的通信软gd
Q其中包括:事g多\分离和事件处理器分派、信号处理、服务初始化、进E间?br>信、共享内存管理、消息\由、分布式服务动态(重)配置、ƈ发执行和同步Q等
{?br>
  (2) StreamModule

  参考网站:http://www.omnifarious.org/StrMod/

  设计用于化编写分布式E序的库。尝试着使得~写处理异步行ؓ的程序更?br>易,而不是用同步的外壛_起异步的本质?br>
  (3) SimpleSocket

  参考网站:http://home.hetnet.nl/~lcbokkers/simsock.htm

  q个cd让编写基于socket的客?服务器程序更加容易?br>
  (4) A Stream Socket API for C++

  参考网站:http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.h
tml

  又一个对Socket的封装库?br>
  5.5 XML

  (1) Xerces

  参考网站:http://xml.apache.org/xerces-c/

  Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证Q以及SAX和DOM API
。XML验证在文档类型定?Document Type DefinitionQDTD)斚w有很好的支持Q?br>q且?001q?2月增加了支持W3C XML Schema 的基本完整的开放标准?br>
  (2) XMLBooster

  参考网站:http://www.xmlbooster.com/

  q个库通过产生特制的parser的办法极大的提高了XML解析的速度Qƈ且能够
生相应的GUIE序来修改这个parser。在DOM和SAX两大LXML解析办法之外提供?br>另外一个可行的解决Ҏ?br>
  (3) Pull Parser

  参考网站:http://www.extreme.indiana.edu/xgws/xsoap/xpp/

  q个库采用pullҎ的parser。在每个SAX的parser底层都有一个pull的parse
rQ这个xpp把这层暴露出来直接给大家使用。在要充分考虑速度的时候值得试?br>

  (4) Xalan

  参考网站:http://xml.apache.org/xalan-c/

  Xalan是一个用于把XML文档转换为HTMLQ纯文本或者其他XMLcd文档的XSLT?br>理器?br>
  (5) CMarkup

  参考网站:http://www.firstobject.com/xml.htm

  q是一U用EDOM的XML解析器。在很多思\上面非常灉|实用。值得大家在D
OM和SAX之外L一点灵感?br>
  (6) libxml++

  http://libxmlplusplus.sourceforge.net/

  libxml++是对著名的libxml XML解析器的C++装版本

  5.6 U学计算

  (1) Blitz++

  参考网站:http://www.oonumerics.org/blitz/

  Blitz++ 是一个高效率的数D函数库Q它的设计目的是希望建立一套既?br>像C++ 一h便,同时又比Fortran速度更快的数D环境。通常Q用C++所写出
的数值程序,?Fortran?0%左右Q因此Blitz++正是要改掉这个缺炏V方法是?br>用C++的template技术,E序执行甚至可以比Fortran更快。Blitz++目前仍在发展?br>Q对于常见的SVDQFFTsQQMRES{常见的U性代数方法ƈ不提供,不过使用者可?br>很容易地利用Blitz++所提供的函数来构徏?br>
  (2) POOMA

  参考网站:http://www.codesourcery.com/pooma/pooma

  POOMA是一个免费的高性能的C++库,用于处理q行式科学计。POOMA的面向对
象设计方便了快速的E序开发,对ƈ行机器进行了优化以达到最高的效率Q方便在
工业和研I环境中使用?br>
  (3) MTL

  参考网站:http://www.osl.iu.edu/research/mtl/

  Matrix Template Library(MTL)是一个高性能的泛型组件库Q提供了各种格式
矩阵的大量线性代数方面的功能。在某些应用使用高性能~译器的情况下,比如In
tel的编译器Q从产生的汇~代码可以看出其与手写几乎没有两L效能?br>
  (4) CGAL

  参考网站:www.cgal.org

  Computational Geometry Algorithms Library的目的是把在计算几何斚w的大
部分重要的解x案和Ҏ以C++库的形式提供l工业和学术界的用户?br>
  5.7 游戏开?br>
  (1) Audio/Video 3D C++ Programming Library

  参考网站:http://www.galacticasoftware.com/products/av/

  AV3D是一个跨q_Q高性能的C++库。主要的Ҏ是提供3D囑ŞQ声效支持(S
B,以及S3MQ,控制接口Q键盘,鼠标和遥感)QXMS?br>
  (2) KlayGE

  参考网站:http://home.g365.net/enginedev/

  国内游戏开发高手自qC++开发的游戏引擎。KlayGE是一个开放源代码、跨q?br>台的游戏引擎Qƈ使用Python作脚本语a。KlayGE在LGPL协议下发行。感谢龚敏敏
先生Z国游戏开发事业所做出的A献?br>
  (3) OGRE

  参考网站:http://www.ogre3d.org

  OGREQ面向对象的囑Ş渲染引擎Q是用C++开发的Q用灵zȝ面向对象3D引擎
。它的目的是让开发者能更方便和直接地开发基?Dg讑֤的应用程序或游戏?br>引擎中的cdҎ底层的系l库Q如QDirect3D和OpenGLQ的全部使用l节q行?br>抽象Qƈ提供了基于现实世界对象的接口和其它类?br>
  5.8 U程

  (1) C++ Threads

  参考网站:http://threads.sourceforge.net/

  q个库的目标是给E序员提供易于用的c,q些c被l承以提供在Linux环境
中很隄到的大量的线E方面的功能?br>
  (2) ZThreads

  参考网站:http://zthread.sourceforge.net/

  一个先q的面向对象Q跨q_的C++U程和同步库?br>
  5.9 序列?br>
  (1) s11n

  参考网站:http://s11n.net/

  一个基于STL的C++库,用于序列化PODQSTL容器以及用户定义的类型?br>
  (2) Simple XML Persistence Library

  参考网站:http://sxp.sourceforge.net/

  q是一个把对象序列化ؓXML的轻量的C++库?br>
  5.10 字符?br>
  (1) C++ Str Library

  参考网站:http://www.utilitycode.com/str/

  操作字符串和字符的库Q支持Windows和支持gcc的多U^台。提供高度优化的
代码Qƈ且支持多U程环境和UnicodeQ同时还有正则表辑ּ的支持?br>
  (2) Common Text Transformation Library

  参考网站:http://cttl.sourceforge.net/

  q是一个解析和修改STL字符串的库。CTTL substringcd以用来比较,插入Q?br>替换以及用EBNF的语法进行解析?br>
  (3) GRETA

  参考网站:http://research.microsoft.com/projects/greta/

  q是由微软研I的研Ih员开发的处理正则表达式的库。在型匚w的情?br>下有非常优秀的表现?br>
  5.11 l合

  (1) P::Classes

  参考网站:http://pclasses.com/

  一个高度可UL的C++应用E序框架。当前关注类型和U程安全的signal/slot
机制Qi/opȝ包括Z插g的网l协议透明的i/o架构Q基于插件的应用E序消息
日志框架Q访问sql数据库的cȝ{?br>
  (2) ACDK - Artefaktur Component Development Kit

  参考网站:http://acdk.sourceforge.net/

  q是一个^台无关的C++lg框架Q类gJava或?NET中的框架Q反机Ӟ
U程QUnicodeQ废料收集,I/OQ网l,实用工具QXMLQ等{)Q以及对Java, P
erl, Python, TCL, Lisp, COM ?CORBA的集成?br>
  (3) dlib C++ library

  参考网站:http://www.cis.ohio-state.edu/~kingd/dlib/

  各种各样的类的一个综合。大整数QSocketQ线E,GUIQ容器类,以及览?br>录的API{等?br>
  (4) Chilkat C++ Libraries

  参考网站:http://www.chilkatsoft.com/cpp_libraries.asp

  q是提供zipQe-mailQ编码,S/MIMEQXML{方面的库?br>
  (5) C++ Portable Types Library (PTypes)

  参考网站:http://www.melikyan.com/ptypes/

  q是STL的比较简单的替代品,以及可移植的多线E和|络库?br>
  (6) LFC

  参考网站:http://lfc.sourceforge.net/

  哦,q又是一个尝试提供一切的C++?br>
  5.12 其他?br>
  (1) Loki

  参考网站:http://www.moderncppdesign.com/

  哦,你可能抱怨我早该和Boost一起介l它Q一个实验性质的库。作者在loki?br>把C++模板的功能发挥到了极致。ƈ且尝试把cM设计模式q样思想层面的东襉K过
库来提供。同时还提供了智能指针这h较实用的功能?br>
  (2) ATL

  ATL(Active Template Library)

  是一l小巧、高效、灵zȝc,q些cMؓ创徏可互操作的COMlg提供了基本的
设施?br>
  (3) FC++: The Functional C++ Library

  q个库提供了一些函数式语言中才有的要素。属于用库来扩充语言的一个代?br>作。如果想要在OOP之外L另一分的乐趣Q可以去看看函数式程序设计的世界。大
师Peter Norvig?“Teach Yourself Programming in Ten Years”一文中将?br>数式语言列ؓ臛_应当学习?cȝE语a之一?br>
  (4) FACT!

  参考网站:http://www.kfa-juelich.de/zam/FACT/start/index.html

  另外一个实现函数式语言Ҏ的?br>
  (5) Crypto++

  提供处理密码Q消息验证,单向hashQ公匙加密系l等功能的免费库?br>
  q有很多非常Ȁ动h心或者是极其实用的C++库,限于我们的水q以及文章的?br>q不能包括进来。在对于q些已经包含q来的库的介l中Q由于ƈ不是每一个我?br>都用过Q所以难免有偏颇之处Q请读者见谅?br>
------------------------------------------------------------------------
--------

  6Q书c?br>
  以前熊节先生曾撰文评论相对于JavaE序设计语言QC++的好书多如牛毛。荣耀
先生在《程序员》杂志上撰文《C++E序设计之四书五l》也本领域内几乎所有的
l典书籍作了全面的介l?M关于书的评论此时看来便是很多余的了。个人浅见,
除非你打以C++作ؓ唯一兴趣或者生存之本,一般读者确实没有够的旉和必?br>?0余本书籍全部阅读。更有参考h值的是荣耀先生的另一文章:《至应该阅
ȝ九本C++著作》,可以从下面的地址览到此文:

  http://www.royaloo.com/articles/articles_2003/9CppBooks.htm

  下面几本书对于走在C++初学之\上的读者是我们最愿意推荐l大家的Q?br>
  (1) 《C++ Primer?br>
  哦,也许你会抱怨我们ؓ什么不先介lTCPL,但对于走在学习之路上的入门者,
本书内容更ؓ全面Q更l易懂,我们U它?#8220;C++的超U宝?#8221;q不q分。配?br>一本不错的习题解答《C++ Primer Answer Book》可以辅助你的学习之路?br>
  (2) 《Essential C++?br>
  如果说《C++ Primer》是C++领域的超U宝典,那么此书作ؓ掌握C++的大局?br>当之无愧。正如?NET大局观》一书能够让读者全?NETQ本书讲qCC++中最核心
的全部主题。书虽不厚,内容_Q不׃ؓ《C++ Primer》读者茶余饭后的主题?br>之作?br>
  (3) 《The C++ Programming Language?br>
  BjarneZ带来的C++教程Q真正能够告诉你怎么用才叫真正的C++的唯一一?br>书。虽然如?#8220;某某E序设计语言”q样的书c会l大家一个内容全揽,入门到精
通的感觉Q但本书实不太适合初学者阅诅R如果你自认为是一名很有经验的C++E?br>序员Q那臛_也要反复咀嚼Bjarne先生所的若q内宏V?br>
  (4) 《Effective C++》,《More Effective C++?br>
  是的Q正如一些C++爱好者经总读过与没有读q上qC本作品来区分你是否是
C++高手。我们也极力推崇q两本著作。在各种介绍C++专家l验的书c里面,q两
本是最贴近语言本质Q看后最能够有脱胎换骨感觉的书,L书你需每日三省汝n
?br>
  技术书c仁者见仁,q多的评论反无太多意义,p者喜好选择最适合自己?br>书方Z{?br>
------------------------------------------------------------------------
--------

  7Q资源网?br>
  正如我们可以通过计算机历史上的重要h物了解计机史的发展QC++相关人物
的网站也可以使我们得到最有h值的参考与借鉴Q下面的人物我们认ؓ没有介绍?br>必要Q只因下面的人物在C++领域的地位众所周知Q我们只相关的资源q行|列?br>供读者学习,他们有的工作于贝实验室Q有的工作于知名~译器厂商,有的在不
断推q语a的标准化Q有的ؓ读者撰写了多部千古奇作……
  (1) Bjarne Stroustrup
  http://www.research.att.com/~bs/

  (2) Stanley B. Lippman
  http://blogs.msdn.com/slippman/
  中文?http://www.zengyihome.net/slippman/index.htm

  (3) Scott Meyers
  http://www.aristeia.com/

  (4) David Musser
  http://www.cs.rpi.edu/~musser/

  (5) Bruce Eckel
  http://www.bruceeckel.com

  (6) Nicolai M. Josuttis
  http://www.josuttis.com/

  (7) Herb Sutter
  http://www.gotw.ca/

  (8) Andrei Alexandrescu
  http://www.coderncppdesign.com/

  (9) 侯捷先生
  http://www.jjhou.com

  (10) 孟岩先生
  先生J忙于工作,痴迷于技术,暂无个h主页Q关于先生的作品可以通过CSDN
的专栏和侯先生的主页讉K到?br>
  (11) 荣耀先生
  http://www.royaloo.com/

  (12) 潘爱民先?br>  http://www.icst.pku.edu.cn/panaimin/pam_homepage.htm

  除了上述大师的主外Q以下的l合cC++学习参考站Ҏ我们非常愿意向大?br>推荐的:

  (1) CodeProject
  http://www.codeproject.com

  (2) CodeGuru
  http://www.codeguru.com

  (3) Dr. Dobb's Journal
  http://www.ddj.com

  (4) C/C++ Users Journal
  http://www.cuj.com

  (5) Cl视?br>  http://www.c-view.org

  (6) allaboutprogram
  http://www.allaboutprogram.com
  其他资料

  (1) ISO IEC JTC1/SC22/WG21 - C++Q标准C++的权威参?br>  http://anubis.dkuug.dk/jtc1/sc22/wg21/

  (2) C++ FAQ LITE ?Frequently Asked Questions: 最为全面的C++FAQ
  http://www.sunistudio.com/cppfaq/index.html
  C/C++ 新闻l:
  你不妨尝试从q里提问和回{问题,很多不错的Q&A资源......

  (1) .alt.comp.lang.learn.c-c++
  q个单些Q如果你和我一h个菜?br>
  (2) .comp.lang.c++.moderated
    嗯,q个昄水^高一?br>
  (3) .comp.std.c++
  如果你需要讨论标准C++相关话题的话

------------------------------------------------------------------------
--------

  8Q不得不写的l束?br>
  l束的时候也是ȝ现状Q展望未来的时候。虽然C++从脱胎于C开始,一路艰
隑֝L走过来,但是无论如何C++已经取得了工业基的地位。文章列丄大量相关
资源是最好的证明Q而业界的大量用C++写成的品代码以及大量的C++职业工程
师则是最直接的证明。同Ӟ我们可以看到各个高校的计机专业都开设有C++q门
评Q网l上对于C++的学习讨Z从来都没有停q。但是,在Java?NET两大企业
开发^台的围攻下,lh的感觉是C++来?#8220;不行”了?br>
  C++在面向企业的软g开发中Q在开发便h等斚w的确要比Java和C#差很多,
其中一个问题是C++语言本n比较复杂Q学习曲U比较陡峭,另外一个问题是C++?br>准化的时间太长,丧失了很多的壮大ZQ耗费了很多精力在厂商的之间的斗争?br>Q而C++的标准库M个完善的E序开发框架还~少太多太多的内容,各个W三方的
cd和框架又在一致性和完整性上没法和随q_提供的框架相提ƈ论。难道C++真的
要退出历史舞CQ?br>
  从C++目前的活跃程度,以及应用现状来说是完全能够肯定C++仍然是Y件工?br>的基Q也不会退出历史舞台的。另外从BoostQLokiq些库中我们也能够看到C++
的发展非常活跃,对于新技术新思维非常Ȁq,C++仍然q泛受到x。从ACE在高
性能通信领域的应用,以及MTLq样的库在数D领域的表现Q我们可以看?br>C++在高性能应用场合下的不可替代的作用,而嵌入式pȝq样的内存受限开发^?br>Q比如Symbian OS上,C++已经发挥着q且发挥更大的作用。可以预见的是以后的
软g无论上层的应用怎么变,它的底层核心都会是由C/C++q样的系l软g~写?br>Q比如Java虚拟机,.NET Framwork。因为只有这LpȝUY件才能完全彻底的?br>挥机器的功能?br>
  需要看到的是两个趋势,一个趋势是C++变得更加复杂Q更加学院派Q通过模板
{有潜力的语法因素构造越来越_y的库成ؓ了现代C++的热点,虽然在利用库实现
新的~程范式Q乃臌计模式等斚w很有开创意义,也确实生了一些能够便捷开
发的工具Q但是更多的是把C++变得更加强大Q更加复杂,也更加难懂,g也更?br>学院z,不得不说它正在向边缘化道路发展。另一个趋势是C++在主的企业应用开
发中已经逐渐退ZQERPq样的企业Y件开发中基本上不会考虑C++Q除非需要?br>虑性能或者和遗留代码的集成这些因素。C++退守到pȝU别语言Q成Y件工业的
基础是大势所。然而反思一下,真的是退守么Q自从STL出现Q无数的人风起云?br>的开始支持C++,他们狂呼“我看到深夜消׃Q目标Y件工E的出现。我看到了可
l护的代码?#8221;是的QSTL在可l护性下做得如此。但是又怎样呢?STL为C++?br>q了C软g工程的道路,而在上层应用E序软g开发领域这块场地早不单独属?br>C++,很多E序设计语言都做得很Q疯狂的支持者会毫不犹U地说我们应当支持
C++,因ؓ它是世界上最的语言。而坦率地_你的腰杆真的那么么Q也许只?br>在逃避一些事实。C++是优U的,q不可否认,STL的出现让C++一度走上了最辉煌?br>时刻Q然而现在看?#8230;…我的一位恩师曾aQ真正能够将STL应用得淋漓尽致的人很
保守地说国内也不过200人,或许不加入STL能够使C++向着它应当发展的方向发展
的更好,而现在看来,C++也应当回首到真正属于他的那一片圣C……

------------------------------------------------------------------------
--------

参考资?br>
本文成文时参考了以下资源Q?br>
1、《程序员?004q?月,3月,“C++ E序设计之四书五l?#8221; 荣耀

2、水'木清华BBS C++版精华区

3、http://jjhou.csdn.net

4、http://www.royaloo.com

5、http://www.zengyihome.net

6、C/C++ 开发h员:充实您的 XML 工具?http://www-900.ibm.com/developerW
orks/cn/xml/x-ctlbx/index.shtml

- 全文?-


Gu.paladino 2007-06-06 16:44 发表评论
]]>
˾þþƷӰԺ| ɫ͵͵91þۺ| ĻþþƷAPP | ˾þۺӰԺ| 2020˾þþƷ| 99þ99ֻѷѾƷ| þþþƷһ | 99þù¶Ʒ| 999þþѹƷ| þþþþþþþþ| þˬˬ| ݹ97þ÷ѹۿ| vaþþþ| ˾Ʒþ޸岻 ˾Ʒþ޸岻 ˾Ʒþ | þþþþҹƷ| Ʒþþþþ12 | AVۺϾþ| Ʒþþþþþþ| Ʒþþþá| 99þþƷѿһ| 99þerֻоƷ18| 7777Ʒ˾þþô߽| þ޹ҹƷƬ| ˾þô߽ۺӰԺҳ| ƷѾþ| þùѹۿƷ| Ʒþþþþ| ɫþþۺľþav| ŷ޾þav| ޾ƷƷþ99| þav߳avav紵| ݹƷþ| ݺݾþŷר | þŮƵ| ղƷþþһ| ƷۺϾþþþþ97| ҹƷþþþ| ˳ŷþ| 2021þþƷѹۿ| AVպƷþþþ| ٸþ|