• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一如技網(wǎng)
            -游戲開(kāi)發(fā)新人
            posts - 3,  comments - 3,  trackbacks - 0
             公司招你進(jìn)來(lái),其實(shí)最重要的就是看到你的工作能力和工作態(tài)度是可以接受的。

                        工作能力指你能滿足他們的工作期望,或者在可接受的時(shí)間范圍內(nèi),經(jīng)過(guò)培訓(xùn)后,可以滿足這個(gè)工作期望。

                        工作態(tài)度指你能有些做職員的基本素質(zhì)。

                  這個(gè)道理應(yīng)該所有人都清楚。但是到實(shí)際事情時(shí)候就經(jīng)常犯迷糊。下面幾點(diǎn)是經(jīng)常會(huì)出問(wèn)題的地方:

             

            1、不經(jīng)測(cè)試,Review,就認(rèn)為自己工作完成了。

                   你的代碼或者應(yīng)用一旦被別人Review ,或者進(jìn)行試用。這時(shí)候你代碼的好壞,或者功能是否在各種場(chǎng)景下是否可用,都會(huì)影響你這個(gè)人在上級(jí)及同事眼里的可信任度。

                   代碼書(shū)寫(xiě)的規(guī)范,性能的高質(zhì)量,各種功能在各個(gè)場(chǎng)景都可用,則表示你這個(gè)人是完全可信的。下次上級(jí)給你分派任務(wù)的時(shí)候,就可以給你更多的自由度來(lái)發(fā)揮。長(zhǎng)此以往,前途和錢(qián)途自然就隨手可得。

                    反之,代碼不規(guī)范,功能好些場(chǎng)景不可用。這只能讓上級(jí)或同事覺(jué)得你不可信任。每次都需要處理你帶來(lái)的這些問(wèn)題,說(shuō)惡心點(diǎn)就是你每次拉完大便都沒(méi)擦屁股,每次都得你的同事和上級(jí)幫你擦屁股。數(shù)次都這樣后,上級(jí)或同事下次跟你溝通的時(shí)候就會(huì)覺(jué)得你這個(gè)人不可信任,一件事情必須反復(fù)多次強(qiáng)調(diào),總覺(jué)得你還會(huì)作出問(wèn)題。你的信用已經(jīng)非常危險(xiǎn)了。

                   你在別人眼里的信用就這樣被你慢慢透支了。透支到一定程度,走人吧。整個(gè)團(tuán)隊(duì)的效率會(huì)因?yàn)槟愣兟總€(gè)人跟你溝通的成本都會(huì)影響到他本人的產(chǎn)出),你不走人誰(shuí)走人。

             

            2、最短可接受的工作時(shí)限

                   你有沒(méi)有統(tǒng)計(jì)過(guò),公司分派給你一個(gè)工作時(shí)候,上級(jí)指定的這項(xiàng)工作計(jì)劃做多久的預(yù)計(jì),跟你自己的預(yù)計(jì)有多大差異?

                   如果你預(yù)計(jì)時(shí)間大于上級(jí)給的工作計(jì)劃時(shí)間,同時(shí)上級(jí)沒(méi)有增派人手進(jìn)行相關(guān)工作。除了BT的領(lǐng)導(dǎo)外,那只有一種情況:上級(jí)對(duì)你的工作態(tài)度非常不滿,認(rèn)為你的薪水對(duì)應(yīng)的工作能力不是這么點(diǎn)。

                   對(duì)于剛工作的,更多的是你表現(xiàn)出來(lái)的工作能力在公司的平均工作能力之下。同時(shí)公司覺(jué)得你對(duì)工作沒(méi)有表現(xiàn)出足夠的熱情。 一個(gè)能力在平均水平下面,又缺乏工作激情的人,他的前途在那里??

                   如果這個(gè)人還沒(méi)有表現(xiàn)出幾個(gè)月后能達(dá)到平均水平之上的希望,為啥會(huì)留這樣一個(gè)人呢?

             

            3、工作能力不等于技術(shù)水平

                   我曾看到過(guò)有人抱怨說(shuō)大公司的員工也不過(guò)是這技術(shù)水平, 這么簡(jiǎn)單的技術(shù)問(wèn)題都不會(huì)。我自己早期也有這樣想法,后來(lái)發(fā)現(xiàn)是不對(duì)的。

                   不論大公司還是小公司,要得是解決問(wèn)題的工作能力。 我的曾經(jīng)手下就有好幾個(gè)技術(shù)水平很牛的,但是作出來(lái)的應(yīng)用卻一次次返工的。為啥,工作能力這些非技術(shù)因素他們做的很不好。

                   工作能力的非技術(shù)因素包括的很多: 責(zé)任心,表現(xiàn)就是對(duì)自己寫(xiě)出來(lái)的代碼有一定要讓人放心的責(zé)任; 溝通能力,一個(gè)典型的表現(xiàn)就是需求不理解或者需求不明時(shí),及時(shí)得跟相關(guān)人溝通,而不是自己先按自己想法實(shí)現(xiàn),造成代碼寫(xiě)完后再返工的惡果等等。

                   技術(shù)水平低,但是解決問(wèn)題能力強(qiáng)的,我也碰到過(guò)一些人。 工作的能力更重要的是這些非技術(shù)的工作能力,而不是技術(shù)水平。技術(shù)人員很容易技術(shù)水平高,但是非技術(shù)的工作能力差。 這是很糟糕的。

                 

             

            4、發(fā)展?jié)摿?,學(xué)習(xí)能力

                  公司使用的技術(shù)不可能一直不變,一直不變的公司只能慢慢被市場(chǎng)淘汰。這就要求員工能不斷的學(xué)習(xí)新的知識(shí),并應(yīng)用到工作中來(lái)。

                  要想不會(huì)出現(xiàn)幾年后,自己發(fā)現(xiàn)跳槽找個(gè)工作都沒(méi)人要,趕快學(xué)習(xí)吧。

                  堅(jiān)持,是一個(gè)人最難做到的。 但是不堅(jiān)持,那就等著滅亡吧。

             

             

            5、笨鳥(niǎo)先飛

                  一個(gè)人,在公司,如果工作能力在平均線以下, 加班吧, 不要有任何幻想。

                  最可怕的是自己沒(méi)這個(gè)意識(shí), 自認(rèn)為自己技術(shù)水平很牛, 但是解決問(wèn)題的工作能力卻在平均水平線以下, 眼高手低 , 這樣的人, 公司是不能留的。

             

             

            6、承諾到的事情一定要做到,不要找理由

                   一件事情沒(méi)有被做完,想找理由能找很多的。既然你承諾了某個(gè)時(shí)間點(diǎn)前完成,就不要再找各種理由推脫。

                   公司同事和上級(jí)雖然可能這次接受了你的理由,但是下次呢, 慢慢的就會(huì)讓你的上級(jí),同事覺(jué)得你是一個(gè)喜歡推托的人。 感覺(jué)你干事是非常不可靠的。不知道那次就會(huì)不完成,下次誰(shuí)敢再找你干事?

             

            新補(bǔ)充的:

            7、有能力者不用加班,能力在平均線之下的自覺(jué)加班吧

            從CSDN的評(píng)論中,爭(zhēng)議最大的一個(gè)在加班。我這里就補(bǔ)充一下我對(duì)加班的看法。

            首先,所有人加班,這肯定是領(lǐng)導(dǎo)者的責(zé)任, 整體的工作進(jìn)度壓力過(guò)大了。

            連續(xù)的不間斷的加班,這也是領(lǐng)導(dǎo)者的責(zé)任,人不可能一直處于線綁緊的狀態(tài)。

            但是,如果一個(gè)部門(mén),部分人加班,部分人不加班,而且并不是因?yàn)轭I(lǐng)導(dǎo)弱智的把一些人工作分派多,一些人工作分派少導(dǎo)致的。加班的人只能說(shuō)明他的工作能力在部門(mén)的平均線之下。
            同一個(gè)工作, A 員工干的話 3 天完成, B 員工干的話 5天完成。 最后如果這個(gè)工作分派給 B 員工, 很可能是要求他 4天完成。 而且他必須自覺(jué)加班。

            這就是我所說(shuō)的 : 有能力者不用加班,能力在平均線之下的自覺(jué)加班。

             

            posted @ 2009-01-01 20:39 kzhang 閱讀(330) | 評(píng)論 (0)編輯 收藏

            一個(gè)游戲程序員的學(xué)習(xí)資料

             

            想起寫(xiě)這篇文章是在看侯杰先生的《深入淺出MFC》時(shí),突然覺(jué)得自己在大學(xué)這幾年關(guān)于游戲編程方面還算是有些心得,因此寫(xiě)出這篇小文,介紹我眼中的游戲程序員的書(shū)單與源代碼參考。一則是作為自己今后兩年學(xué)習(xí)目標(biāo)的備忘錄,二來(lái)沒(méi)準(zhǔn)對(duì)別人也有點(diǎn)參考價(jià)值。我的原則是只寫(xiě)自己研究過(guò)或準(zhǔn)備研究的資料,所以內(nèi)容無(wú)疑會(huì)帶上強(qiáng)烈的個(gè)人喜好色彩,比如對(duì)網(wǎng)絡(luò),數(shù)據(jù)庫(kù)等重要方面完全沒(méi)有涉及。因?yàn)樽约褐饕獙?duì)三維圖形引擎,人工智能算法,腳本系統(tǒng),反外掛(反反外掛? ^^)等方面感興趣。這學(xué)期電腦都沒(méi)聯(lián)網(wǎng)了,在岳麓山閉關(guān)修煉中(^^),連這篇文章都得在學(xué)校圖書(shū)館電子閱覽室(電影放映室?)上傳,內(nèi)容很多憑記憶寫(xiě)出,如有誤差敬請(qǐng)訂正。程序員應(yīng)該在理論學(xué)習(xí)與實(shí)踐編程中反復(fù)迭代,所以學(xué)習(xí)資料是一回事,須知盡信書(shū)不如無(wú)書(shū)。

             

            一、書(shū)籍:

            算法與數(shù)據(jù)結(jié)構(gòu):

            《數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)》——嚴(yán)蔚敏、吳偉民 清華出版社

            我覺(jué)得其配套習(xí)題集甚至比原書(shū)更有價(jià)值,每個(gè)較難的題都值得做一下。

             

            Introduction to Algorithms》第二版 中文名《算法導(dǎo)論》

            關(guān)于算法的標(biāo)準(zhǔn)學(xué)習(xí)教材與工程參考手冊(cè),在去年CSDN網(wǎng)站上其翻譯版竟然評(píng)為年度二十大技術(shù)暢銷(xiāo)書(shū),同時(shí)《程序員》雜志上開(kāi)設(shè)了“算法擂臺(tái)”欄目,這些溯源固本的舉動(dòng),不由得使人對(duì)中國(guó)現(xiàn)今浮躁不堪的所謂“IT”業(yè)又產(chǎn)生了一線希望。這本厚厚的書(shū),幸虧打折我才買(mǎi)得起。雖然厚達(dá)千頁(yè),但其英文通俗曉暢,內(nèi)容深入淺出,可見(jiàn)經(jīng)典之作往往比一般水準(zhǔn)的書(shū)還耐讀。還能找到MIT的視頻教程,第一節(jié)課那個(gè)老教授嘻皮笑臉的,后面就是一長(zhǎng)發(fā)助教上課了。

             

            C語(yǔ)言名題精選百則 技巧篇》——冼鏡光 機(jī)械工業(yè)出版社

            作者花費(fèi)一年時(shí)間搜集了各種常見(jiàn)C程序段的極具技巧性的編程法,其內(nèi)容都是大有來(lái)頭的,而且給出了詳細(xì)的參考資料。如一個(gè)普通的Fibonacci數(shù)就給出了非遞歸解、快速算法、擴(kuò)充算法等,步步深入,直至幾無(wú)油水可榨。對(duì)于視速度如生命,連一個(gè)普通的浮點(diǎn)數(shù)轉(zhuǎn)化為整數(shù)都另辟蹊徑以減少CPU cycle的游戲程序員,怎可不看?

             

            《計(jì)算機(jī)算法基礎(chǔ)(第二版)》—— 佘祥宣等 華中科大出版社

            我看到幾個(gè)學(xué)校的研究生拿它作教材(研究生才開(kāi)算法,太開(kāi)玩笑了吧)。這本書(shū)薄是薄了點(diǎn),用作者的話來(lái)說(shuō),倒也“精辟”。其實(shí)此書(shū)是《Fundamentals of Computer Algorithms》的縮寫(xiě)版,不過(guò)原書(shū)出版太久了,反正我是沒(méi)找到。

             

            The Art of Computer ProgrammingVolume 1-3

            作者Donald E. Knuth是我心目中與馮.諾依曼、DijkstraShannon并列的四位大師。這本書(shū)作者從讀大學(xué)本科時(shí)開(kāi)始寫(xiě),一直寫(xiě)到博士時(shí),十年磨一劍,足見(jiàn)其下足了功夫??勺鳛橛?jì)算機(jī)技術(shù)的核心——算法與數(shù)據(jù)結(jié)構(gòu)的終極參考手冊(cè)。創(chuàng)新處也頗多,譬如常見(jiàn)的Shell排序他在書(shū)中提出可用(3i-1)/2的間隔,這使其稍快于O(n1. 5)。當(dāng)然這套書(shū)描述高度數(shù)學(xué)化,為此恐怕一般的人(我?)最好還得先看一本數(shù)學(xué)預(yù)備書(shū)《Concrete Mathematics》(直譯為混凝土數(shù)學(xué)?^^)再說(shuō)。可惜的是這套書(shū)才出到第三卷,并沒(méi)有覆蓋全部常見(jiàn)的算法內(nèi)容。不過(guò)好在對(duì)于游戲程序員來(lái)說(shuō),越常見(jiàn)的算法用得越多,這也不算是什么要命的損失。

             

            STL源碼剖析》—— 侯捷 華中科大出版社

            侯捷不用介紹了,華人技術(shù)作家中的旗艦,說(shuō)其有世界級(jí)水準(zhǔn)也不為過(guò)。這本書(shū)我以為是C++與數(shù)據(jù)結(jié)構(gòu)的葵花寶典(欲練此功,必先自宮)。也就是說(shuō),不下幾層地獄很難看懂,因?yàn)樗蟮念A(yù)備知識(shí)太多了,如STL、數(shù)據(jù)結(jié)構(gòu)、泛型編程、內(nèi)存管理都要很扎實(shí)(為此是不是還要看看有內(nèi)存管理設(shè)計(jì)模式之稱(chēng)的《Small Memory Software》這本書(shū)呢?),但是一旦看懂,真會(huì)是所向披靡。

             

            Data Structures for Game Programmers

            每個(gè)數(shù)據(jù)結(jié)構(gòu)的例程都是一個(gè)小游戲,還用SDL庫(kù)實(shí)現(xiàn)了一個(gè)算法演示系統(tǒng)。雖然內(nèi)容失之于淺,但起碼讓人了解了數(shù)據(jù)結(jié)構(gòu)在游戲中的作用。

             

            其實(shí)游戲程序并不比其它程序特殊,甚至要求基本功更加扎實(shí),所以花時(shí)間做一些看似與實(shí)際應(yīng)用不甚相干的習(xí)題,對(duì)今后的工作是大有裨益的。而且有些應(yīng)用很廣的算法,如常被人津津樂(lè)道的A*算法及其變種,牽涉到圖的檢索周游與分枝-限界法,恐怕還得讀一些艱深的論文才能充分明白運(yùn)用,如Donald E. Knuth的《An analysis of alpha-beta cutoffs》。其實(shí)還有不少此類(lèi)的好書(shū),如《Data Structures and Algorithms in C++》、《Programming Pearls》、《More Programming Pearls》(算法珠璣)等,我卻以為要先看嚴(yán)謹(jǐn)一點(diǎn)的著作,再看內(nèi)容隨筆一點(diǎn)的書(shū)。

             

            匯編:

            IBM-PC 匯編語(yǔ)言程序設(shè)計(jì)》第二版 

            國(guó)內(nèi)經(jīng)典教材。

            The Art of Assembly Language

            這本書(shū)足有1600頁(yè),噢!

             

            C語(yǔ)言:

            The C Programming Language》第二版

            雖然篇幅短小,但每個(gè)例程都很經(jīng)典。(我們老師開(kāi)始拿它作教材,后面換為譚小強(qiáng)的C語(yǔ)言書(shū),理由為:例子盡是些文本處理。我就納了悶了,難道現(xiàn)代的計(jì)算機(jī)程序不是將大量時(shí)間消耗在字符串與文本的處理上嗎?)

             

            C++

            學(xué)過(guò)C語(yǔ)言,再學(xué)C++,先看這本《C++ Primer》的縮寫(xiě)版:

            Essential C++

            對(duì)C++有個(gè)入門(mén)了解,再看

            C++ Common Knowledge: Essential Intermediate Programming

            就不會(huì)有什么重要的知識(shí)點(diǎn)完全不知所措了,接下來(lái)是

            The C++ Standard Library : A Tutorial and Reference

            標(biāo)準(zhǔn)庫(kù),當(dāng)然主要是標(biāo)準(zhǔn)模板庫(kù)的標(biāo)準(zhǔn)學(xué)習(xí)參考手冊(cè),然后最好平時(shí)邊寫(xiě)程序邊參悟。

            Effective C++》等

            我是說(shuō)書(shū)名以形容詞 + C++的那些書(shū),計(jì)有七八本,慢慢看吧,羅馬不是一日建成的。

            (Essential C++》、《Effective C++》、《More Effective C++》、《Accelerated C++》、《Effective STL》、《Exceptional C++》、《More Exceptional C++》、《Imperfect C++》,雖然書(shū)名格式相似,但每一本都絕非馬虎之作。)

             

            誰(shuí)說(shuō)C++程序比C程序要慢?那就請(qǐng)看下面:

            The Design and Evolution of C++

            知其過(guò)去才能知其未來(lái),才能應(yīng)用。

            Inside the C++ Object Model

            揭露C++的編譯器模型。

            Efficient C++ Performance Programming Techniques

            當(dāng)算法優(yōu)化已到極致,在運(yùn)用匯編之前,最后還可看看此書(shū),有時(shí)高級(jí)和低階都能做成相同的事情。

             

            還有兩本特別的書(shū):

            Modern C++ Design : Generic Programming and Design Patterns Applied

            作者想把設(shè)計(jì)模式和泛型編程結(jié)合起來(lái),并寫(xiě)了個(gè)嘗試提供一切的Loki庫(kù)來(lái)實(shí)作,不過(guò)其觀點(diǎn)并未得到C++社區(qū)的普遍響應(yīng)。盡管如此,本書(shū)仍稱(chēng)得上思想前沿性與技術(shù)實(shí)用性結(jié)合的典范。

             

            C++ Template Metaprogramming

            把編譯器當(dāng)作計(jì)算器?本書(shū)介紹了Boost庫(kù)的MPL模板元編程庫(kù)。當(dāng)然提到Boost庫(kù),對(duì)于游戲程序員不能不提到其中的Graph庫(kù),有《The Boost Graph Library》一書(shū)可看。還有其中Python庫(kù),號(hào)稱(chēng)國(guó)內(nèi)首款商業(yè)三維圖形引擎的起點(diǎn)引擎就用了BoostPython庫(kù)。說(shuō)實(shí)話我覺(jué)得起點(diǎn)引擎還是蠻不錯(cuò)的,那個(gè)自制的三維編輯器雖然界面簡(jiǎn)陋,但功能還算蠻完善,給游戲?qū)W院用作教學(xué)內(nèi)容也不錯(cuò)。另有一個(gè)號(hào)稱(chēng)中國(guó)首款自主研發(fā)的全套網(wǎng)游解決方案。我看到它那個(gè)三維編輯器,心想這不就是國(guó)外一個(gè)叫freeworld3D的編輯器嗎?雖然有點(diǎn)偏門(mén),但我以前還較勁嘗試破解過(guò)呢。還把英文界面漢化了,大概用exescope這樣的資源修改軟件就能搞定吧。我又心想為什么要找freeworld3D這個(gè)功能并不太強(qiáng)大的編輯器呢??jī)H僅是因?yàn)樗阋说綆资澜??它唯一特別一點(diǎn)的地方就是支持導(dǎo)出OGRE圖形引擎的場(chǎng)景格式,這樣一想不由得使人對(duì)它圖形引擎的“自主”性也產(chǎn)生懷疑了。這樣的“自主”研發(fā)真讓人汗顏,只要中國(guó)還沒(méi)封sourceforge這個(gè)網(wǎng)站(據(jù)說(shuō)以前和freeBSD網(wǎng)站一起被封過(guò)?),國(guó)人就能“自主”研發(fā)。

             

            有人還會(huì)推薦《C++ Primer》《Thinking in C++》《The C++ Programming Language》等書(shū)吧,誠(chéng)然這些書(shū)也很好,但我總覺(jué)得它們太大部頭了。還不如多花點(diǎn)時(shí)間看看國(guó)外好的源代碼。

             

            Windows編程

            Operating System Concepts第五版

            國(guó)內(nèi)有些操作系統(tǒng)的教程其實(shí)就是它的縮寫(xiě)版。

             

            Windows 95 System Programming Secrets

            深入剖析了Windows操作系統(tǒng)的種種種種,有人愛(ài)看《Linux內(nèi)核完全注釋》,有人愛(ài)看《自己動(dòng)手寫(xiě)操作系統(tǒng)》這樣煽情的書(shū),但我想作為商業(yè)的操作系統(tǒng),把Windows內(nèi)核剖析到這地步也高山仰止了。

             

            Programming Applications for Microsoft Windows》第四版

            先進(jìn)程線程,再虛存管理,再動(dòng)態(tài)鏈接庫(kù),最多講到消息機(jī)制。作者在序言中說(shuō):“我不講什么ActiveX, COM等等,因?yàn)楫?dāng)你了解了這些基礎(chǔ)后,那些東西很快就會(huì)明白!”可以作為《Programming Windows》的先修課。

             

            計(jì)算機(jī)體系:

            Computer Systems : A Programmers Perspective

            和《The Art of Computer Programming》在我心中是計(jì)算機(jī)史上兩本稱(chēng)得上偉大的書(shū),計(jì)算機(jī)組成原理,操作系統(tǒng),匯編,編譯原理,計(jì)算機(jī)網(wǎng)絡(luò)等等課程匯成這本千頁(yè)的大書(shū),因?yàn)橛?jì)算機(jī)在作者眼中就是一個(gè)整體。

             

            開(kāi)源閱讀:

            Code Reading : The Open Source Perspective

            張大千臨摹了幾百?gòu)埫鞔瘽纳剿?,?huà)出的畫(huà)以假亂真,后來(lái)他去敦煌潛心臨摹幾年,回來(lái)畫(huà)風(fēng)大變,終成大家。程序員其實(shí)有40%的時(shí)間是在讀別人的源代碼,侯捷先生說(shuō):“源碼面前,了無(wú)秘密”,又說(shuō)“天下大事,必作于細(xì)”,可以與他的《上窮碧落下黃泉,源碼追蹤經(jīng)驗(yàn)談》參看。

             

            MFC:

            《深入淺出MFC

            我實(shí)在以為沒(méi)有看過(guò)侯捷先生的《深入淺出MFC》的人多半不會(huì)懂得MFC編程。其實(shí)我是打算用一年多的時(shí)間寫(xiě)一個(gè)給游戲美工用的三維編輯器,順便作為畢業(yè)設(shè)計(jì)。圖形庫(kù)就用MFC吧,反正也沒(méi)得選擇。如果要用wxWidgets無(wú)非是獵奇而已,還不是MFC的翻版,當(dāng)然它跨平臺(tái)了。就象阻擊手對(duì)自己槍械的零件了如指掌一樣,要想用MFC寫(xiě)出非玩具程序的人一定要了解其內(nèi)部構(gòu)造。還有一本書(shū)叫《MFC深入淺出》,并不是同一本。

             

            IDE:

            Microsoft Visual Studio 2005 Unleashed

            工欲善其事,必先利其器。當(dāng)然我認(rèn)為與其用形如Source Insight、Slick EditCode Visualizer之類(lèi)的代碼閱讀器、圖形化工具,還不如用自己的大腦。但如果你嫌打源代碼慢的話,可以用Visual AssistX。如果嫌老是寫(xiě)重復(fù)相似的代碼的話,可以用Code Smith。單元測(cè)試可以用CppUnit,Boost庫(kù)中的測(cè)試框架也不錯(cuò)。有心情可以吧Visual Studio外接IntelCompiler,內(nèi)嵌STLport,但不是大工程,性能分析沒(méi)必要?jiǎng)硬粍?dòng)就用下VTune吧。

             

            程序員之路:

            《游戲之旅——我的編程感悟》

            云風(fēng)大哥。在我心目中游戲程序員國(guó)外首推卡馬克,國(guó)內(nèi)首推云風(fēng)。也許過(guò)兩年我會(huì)到網(wǎng)易當(dāng)云風(fēng)大哥的助理程序員吧。Its my dream.^-^)他寫(xiě)這本書(shū)的時(shí)候本著只有透徹理解的東西才寫(xiě)出來(lái),因此內(nèi)容不會(huì)很酷新,但是相信我,每讀一遍都有新的收獲,主要還不是知識(shí)上的,因?yàn)橹R(shí)是學(xué)無(wú)止境的,授人以魚(yú)不如授人以漁,精神上的啟迪才是長(zhǎng)久的。誠(chéng)如經(jīng)典游戲《仙劍奇?zhèn)b傳》的主力程序員兼美術(shù)指導(dǎo)姚壯憲(人稱(chēng)姚仙)在序言中所說(shuō)的“云風(fēng)得到的只是一些稿費(fèi),而整個(gè)中國(guó)民族游戲產(chǎn)業(yè)得到的將是一次知識(shí)的推動(dòng)”,此言不虛矣。

             

            《編程高手箴言》

            梁肇新是豪杰超級(jí)解霸的作者,本來(lái)每個(gè)合格的程序員(Programmer , 而非Coder)都應(yīng)該掌握的東西,現(xiàn)在變成了編程高手的獨(dú)家箴言。不知是作者的幸運(yùn)還是中國(guó)IT業(yè)的悲哀。知識(shí)點(diǎn)還是講得蠻多的,不過(guò)對(duì)MFC的地位頗有微詞。我實(shí)在認(rèn)為MFC的名聲就是那些不懂得用它的人搞臭的。不過(guò)作者的牢騷也情有可原,每個(gè)具有創(chuàng)造力的程序員都應(yīng)該不太喜歡framework。

             

            Masters of DOOM: How Two Guys Created an Empire and Transformed Pop Culture》中文名《DOOM啟世錄》

            卡馬克,羅洛斯,這些游戲史上如雷貫耳的名字。(現(xiàn)在卡馬克已專(zhuān)注于火箭制造上,羅洛斯則攜妻回鄉(xiāng)隱居)要不是沒(méi)上過(guò)大學(xué)的卡馬克和圖形學(xué)大師亞伯拉罕的功勛,可能到現(xiàn)在游戲中還不知三維為何物。勿庸置疑,在計(jì)算機(jī)界歷史是英雄們所推動(dòng)的。這本書(shū)真實(shí)的記錄了這些塵世英雄的所為所思。

             

            作為程序員的我對(duì)這幾本策劃與美工的書(shū)也產(chǎn)生了濃厚興趣,以前搞過(guò)一兩年的3DS MAX插件編程,覺(jué)得用maxscript還是好過(guò)MaxSDK,畢竟游戲開(kāi)發(fā)中所多的是模型場(chǎng)景數(shù)據(jù)的導(dǎo)入導(dǎo)出,大可不必大動(dòng)干戈。

             

            策劃:

            Creating Emotion in Games : The Craft and Art of Emotioneering

            在壯麗煊目的宏偉三維世界背后,在殘酷的殺戮,動(dòng)人心魄的情節(jié)背后,我們還需要什么來(lái)抓住玩家的心?答對(duì)了,就是emotion.真正打動(dòng)人心的,才是深入骨髓的。

             

            Ultimate Game Design : Building Game Worlds

            從名字可以看出,寫(xiě)給關(guān)卡設(shè)計(jì)師的,特別是講室外自然場(chǎng)景的構(gòu)建頗有可取之處。

             

            Developing Online Games : An Insiders Guide

            就象名為反模式的書(shū)講軟件團(tuán)隊(duì)運(yùn)營(yíng)一樣,這本書(shū)講商業(yè)運(yùn)作多過(guò)技術(shù)。一個(gè)歷經(jīng)艱難,現(xiàn)在盛大的游戲程序員,翻譯了這本書(shū)。

             

            美工:

            Digital Cinematography & Directing

            數(shù)字?jǐn)z影導(dǎo)演術(shù),每當(dāng)你在3DS MAX或者Maya等三維創(chuàng)作軟件中擺放攝影機(jī),設(shè)計(jì)其運(yùn)動(dòng)軌跡時(shí),你可曾想過(guò)你也站在導(dǎo)演的位置上了?

             

            The Animators Survival Kit

            看著這本講卡通角色運(yùn)動(dòng)規(guī)律的書(shū),一邊產(chǎn)生溫習(xí)《貓和老鼠》的念頭,一邊繼續(xù)對(duì)前不久新聞聯(lián)播中關(guān)于中國(guó)產(chǎn)生了某計(jì)算機(jī)自動(dòng)卡通動(dòng)畫(huà)生成軟件報(bào)道的蔑視,這條報(bào)道稱(chēng)此舉可大大加快中國(guó)卡通動(dòng)畫(huà)的產(chǎn)量。我且不從技術(shù)上探討其是否是在放衛(wèi)星(其實(shí)我知道得很清楚,前文已表,本人搞過(guò)一兩年的卡通動(dòng)畫(huà)輔助軟件編程),但計(jì)算機(jī)機(jī)械生成的動(dòng)畫(huà)怎可代替人類(lèi)充滿靈性的創(chuàng)作?

             

            The Dark Side of Game Texturing

            Photoshop制作材質(zhì)貼圖,還真有些學(xué)問(wèn)。

             

            三維圖形學(xué):

            搞三維圖形學(xué)首先還是要扎扎實(shí)實(shí)的先看解析幾何、線性代數(shù)、計(jì)算幾何的教材,后面的習(xí)題一個(gè)都不能少。國(guó)內(nèi)數(shù)學(xué)書(shū)還是蠻好的。蘇步青大師的《計(jì)算幾何》稱(chēng)得上具有世界級(jí)水準(zhǔn),可惜中國(guó)CAD的宏圖被盜版給擊垮了。現(xiàn)在是我們接過(guò)接力棒的時(shí)候了。Its time!

             

             

            Computer Graphics Geometrical Tools

            《計(jì)算機(jī)圖形學(xué)幾何工具算法詳解》算法很多,紕漏處也不少。

             

            3D Math Primer for Graphics and Game Development

            淺易,可作為三維數(shù)學(xué)的“速食“。

             

            Mathematics for 3D Game Programming & Computer Graphics》第二版

            比上面那本深入一些,證明推理的數(shù)學(xué)氣也濃一些,可作為專(zhuān)業(yè)的數(shù)學(xué)書(shū)與編程實(shí)踐一個(gè)過(guò)渡的橋梁吧。內(nèi)容涉獵也廣,射線追蹤,光照計(jì)算,可視裁剪,碰撞檢測(cè),多邊形技術(shù),陰影算法,剛體物理,流體水波,數(shù)值方法,曲線曲面,還真夠豐富。

             

            Vector Game Math Processors

            想學(xué)MMX,SSE嗎,那就看它吧,不過(guò)從基礎(chǔ)講起的,要耐心哦。

             

             DirectX:

            Introduction to 3D Game Programming with DirectX 9.0

            DirectX入門(mén)的龍書(shū),作者自己寫(xiě)的簡(jiǎn)單示例框架,后面我干脆用State模式,把所有例子綁到一塊兒去了。

             

            Beginning Direct3D Game Programming

            作者取得律師學(xué)位后變成了游戲程序員,真是怪也哉。本書(shū)雖定位為入門(mén)級(jí)書(shū),內(nèi)容頗有獨(dú)特可取之處。它用到的示例框架是DXSDK Sample Framework,而不是現(xiàn)在通行的DXUT。要想編譯有兩種辦法吧,一是自己改寫(xiě)成用DXUT的。二是找舊的Sample Framework。我又懶得為了一個(gè)示例框架下載整個(gè)早期版本的DirectX,后面在Nvidia SDK 9.5中發(fā)現(xiàn)了。

             

            Advanced Animation with DirectX

            DirectX高級(jí)動(dòng)畫(huà)技術(shù)。骨骼系統(tǒng),漸變關(guān)鍵幀動(dòng)畫(huà),偶人技術(shù),表情變形,粒子系統(tǒng),布料柔體,動(dòng)態(tài)材質(zhì),不一而足。我常常在想,從三維創(chuàng)作軟件導(dǎo)出的種種效果,變成一堆textbinary,先加密壓縮打包再解包解壓解密,再用游戲程序重建一個(gè)Lite動(dòng)畫(huà)系統(tǒng),游戲程序員也真是辛苦。

             

            OpenGL:

            NeHe OpenGL Tutorials

            雖是網(wǎng)絡(luò)教程,不比正式的書(shū)遜,本來(lái)學(xué)OpenGL就不過(guò)是看百來(lái)?xiàng)lC函數(shù)文檔的工夫吧,如果圖形學(xué)基礎(chǔ)知識(shí)扎實(shí)的話。

             

            OpenGL Shading Language

            OpenGL支持最新顯卡技術(shù)要靠修修補(bǔ)補(bǔ)的插件擴(kuò)展,所以還要配合

            Nvidia OpenGL Extension Specifications

            來(lái)看為上。

             

            Focus on 3D Models

            Focus on 3D Terrain Programming

            Focus on Curves and Surfaces

            顧名思義,三本專(zhuān)論,雖然都很不深,但要對(duì)未知三維模型格式作反向工程前,研讀Geomipmapping地形算法論文前,CAD前,還是要看看它們?yōu)樯?,如果沒(méi)從別處得過(guò)到基礎(chǔ)的話。

             

            腳本:

            先看

            Game Scripting Mastery

            等自己了解了虛擬機(jī)的構(gòu)造,可以設(shè)計(jì)出簡(jiǎn)單的腳本解釋執(zhí)行系統(tǒng)了。

            再去查Python , Lua ,Ruby的手冊(cè)吧,會(huì)事半半功倍倍的。

             

            Programming Role Playing Games with DirectX 8.0

            一邊教學(xué)一邊用DirectX寫(xiě)出了一個(gè)GameCore庫(kù),初具引擎稚形。

             

            Isometric Game Programming with DirectX 7.0

            三維也是建立在二維的基礎(chǔ)上,這就是這本書(shū)現(xiàn)在還值得看的原因。

             

            Visual C++網(wǎng)絡(luò)游戲建模與實(shí)現(xiàn)》

            聯(lián)眾的程序員寫(xiě)的,功力很扎實(shí),講棋牌類(lèi)游戲編程,特別講了UML建模和Rotional Rose

             

            Object-Oriented Game Development

            套用某人的話:“I like this book.

             

            Shader:

            要入門(mén)可先看

            Shaders for Game Programmers and Artists

            講在RenderMonkey中用HLSL高級(jí)著色語(yǔ)言寫(xiě)Shader.

             

            再看

            Direct3D ShaderX : Vertex and Pixel Shander Tips and Tricks

            用匯編著色語(yǔ)言,純銀赤金。

             

            三大寶庫(kù):

            Game Programming Gems

            我只見(jiàn)到1-6本,據(jù)說(shuō)第7、8本也出來(lái)了?附帶的源代碼常有bug,不過(guò)瑕不掩瑜,這套世界頂級(jí)游戲程序員每年一度的技術(shù)文集,涉及游戲開(kāi)發(fā)的各個(gè)方面,我覺(jué)得富有開(kāi)發(fā)經(jīng)驗(yàn)的人更能在其中找到共鳴。

             

            Graphics Gems》全五本

            圖形學(xué)編程Bible,看了這套書(shū)你會(huì)明白計(jì)算機(jī)領(lǐng)域的科學(xué)家和工程師區(qū)別之所在??茖W(xué)家總是說(shuō),這個(gè)東西在理論上可行。工程師會(huì)說(shuō),要使問(wèn)題在logN的時(shí)限內(nèi)解決我只能忍痛割?lèi)?ài),舍繁趨簡(jiǎn)。

             

            GPU Gems》出了二本

            Nvidia公司召集圖形學(xué)Gurus寫(xiě)的,等到看懂的那一天,我也有心情跑去Siggraph國(guó)際圖形學(xué)大會(huì)上投文章碰運(yùn)氣。

             

            游戲引擎編程:

            3D Game Engine Programming

            ZFXEngine引擎的設(shè)計(jì)思路闡釋?zhuān)芷綄?shí),冇太多驚喜。

             

            3D Game Engine Design

            數(shù)學(xué)物理的理論知識(shí)講解較多,本來(lái)這樣就夠了,還能期待更多嗎?

             

            人工智能:

            AI Techniques for Game Programming

            講遺傳算法,人工神經(jīng)網(wǎng)絡(luò),主要用到位數(shù)組,圖算法。書(shū)的原型是根據(jù)作者發(fā)表到GameDev.net論壇上的內(nèi)容整理出來(lái)的,還比較切中實(shí)際。

             

            AI Game Programming Wisdom

            相當(dāng)于AI編程的Gems

             

            PC游戲編程(人機(jī)博弈)

            以象棋程序?yàn)樗{(lán)本,介紹了很多種搜索算法,除了常見(jiàn)的極大極小值算法及其改進(jìn)--負(fù)極大值算法,還有深度優(yōu)先搜索以外。更提供了多種改進(jìn)算法,如:Alpha-Beta,Fail-soft alpha-beta,Aspiration Search, Minimal Window Search,Zobrist Hash,Iterative Deepening,History Heuristic,Killer Heuristic,SSS*,DUAL*,MFD and more.琳瑯滿目,實(shí)屬難得。

             

            反外掛:

            《加密與解密(第二版)》 看雪論壇站長(zhǎng) 段鋼

            破解序列號(hào)與反外掛有關(guān)系么?不過(guò),世上哪兩件事情之間又沒(méi)有關(guān)系呢?

             

            UML DistilledMartin Fowler

            很多人直到看了這本書(shū)才真正學(xué)懂UML。

            Martin Fowler是真正的大師,從早期的分析模式,到這本UML精粹,革命性的重構(gòu)都是他提出的,后來(lái)又寫(xiě)了企業(yè)模式一書(shū)?,F(xiàn)在領(lǐng)導(dǎo)一個(gè)軟件開(kāi)發(fā)咨詢公司,去年JavaOne中國(guó)大會(huì)他作為專(zhuān)家來(lái)華了吧。個(gè)人網(wǎng)站:MartinFowler.com

             

            設(shè)計(jì)模式三劍客:

            Design Patterns Elements of Reusable Object-Oriented Software

            Design Patterns Explained

            Head First Design Patterns 

             

            重構(gòu)三板斧:

            Refactoring : Improving the Design of Existing Code

            Refactoring to Patterns

            Refactoring Workbook

             

            軟件工程:

            Extreme Programming Explained : Embrace Change》第二版

            其中SimplicityValue真是振聾發(fā)聵,這就是我什么都喜歡輕量級(jí)的原因。

             

            Agile Software Development Principles,Patterns,and Practices

            敏捷真是炒得夠火的,連企業(yè)都有敏捷一說(shuō),不過(guò)大師是不會(huì)這么advertising的。

             

            Code Complete》第二版

            名著。

             

            數(shù)學(xué):

            《數(shù)學(xué),確定性的喪失》M.克萊因

            原來(lái)數(shù)學(xué)也只不過(guò)是人類(lèi)的發(fā)明與臆造,用不著供入神殿,想起歷史上那么多不食人間煙火的科學(xué)家(多半是數(shù)學(xué)家),自以為發(fā)現(xiàn)了宇宙運(yùn)作的奧秘,是時(shí)候走下神壇了。

             

            物理:

            《普通物理學(xué)》第一冊(cè) += Physics for Game Developers

            物理我想就到此為此吧,再?gòu)?fù)雜我可要用Newton Engine,ODE了,等待物理卡PPU普及的那天,就可充分發(fā)揮PhysX的功效了,看過(guò)最新的《細(xì)胞分裂》游戲Demo演示,成千上萬(wàn)個(gè)Box瘋狂Collide,骨灰級(jí)玩家該一邊摸錢(qián)包一邊流口水了。

             

            二、開(kāi)源代碼:

            Irrlicht

            著名的鬼火引擎,從兩年前第一眼看到它,這個(gè)輕量級(jí)的三維圖形引擎,就喜歡上了它。源代碼優(yōu)雅,高效,且不故弄玄虛。值得每個(gè)C++程序員一讀,并不限于圖形編程者。它的周邊中也有不少輕量級(jí)的東西。如Lightfeather擴(kuò)展引擎,ICE、IrrlichtRPGIrrWizard.還有IrrEditIrrKlang、IrrXML可用。(可能是為了效率原因,很多開(kāi)源作者往往喜歡自己寫(xiě)XML解析庫(kù),如以上的IrrXML庫(kù),即使有現(xiàn)成的tinyXML庫(kù)可用。這真會(huì)讓tomcat里面塞Axis,Axis里面塞JUDDI,弄得像俄羅斯套娃玩具的Java Web Service Coder們汗顏。)

             

            OGRE

            排名第一的開(kāi)源圖形引擎,當(dāng)然規(guī)模是很大的,周邊也很多。除了以C#寫(xiě)就的OgreStudio ,ofusion嵌入3DS MAX作為WYSWYG式的三維編輯器也是棒棒的,特別是其幾個(gè)場(chǎng)景、地形插件值得研究。以至于《Pro OGRE 3D Programming》一書(shū)專(zhuān)論其用法。搜狐的《天龍八部》游戲就是以其作為圖形引擎,當(dāng)然還另外開(kāi)發(fā)了引擎插塊啦。我早知道OGRE開(kāi)發(fā)組中有一個(gè)中國(guó)人謝程序員,他以前做了很多年的傳統(tǒng)軟件編程。有一次天龍八部游戲的圖形模塊的出錯(cuò)信息中包含了一串某程序員的工作目錄,有一個(gè)文件夾名即是謝程序員的英文名,我據(jù)此推斷謝程序員即是搜狐北京的主程??磥?lái)中國(guó)對(duì)開(kāi)源事業(yè)還是有所貢獻(xiàn)的嘛,王開(kāi)源哥哥的努力看來(lái)不會(huì)白費(fèi)?。?span>^-^)不過(guò)我偵測(cè)的手法也有些像網(wǎng)站數(shù)據(jù)庫(kù)爆庫(kù)了,非君子之所為作。

             

            RakNet

            基于UDI的網(wǎng)絡(luò)庫(kù),竟還支持聲音傳輸,以后和OpenVision結(jié)合起來(lái)做個(gè)視聊程序試試。

             

            Blender

            聲譽(yù)最盛的開(kāi)源三維動(dòng)畫(huà)軟件,竟還帶一個(gè)游戲引擎。雖然操作以快捷鍵驅(qū)動(dòng),也就是說(shuō)要背上百來(lái)個(gè)快捷鍵才能熟練使用。但是作為從商業(yè)代碼變?yōu)殚_(kāi)源之作,威脅三維商業(yè)巨頭的輕騎兵,歷經(jīng)十年錘煉,代碼達(dá)百萬(wàn)行,此代碼只應(yīng)天上有,人間哪得幾回看,怎可不作為長(zhǎng)期的源碼參考?

             

            風(fēng)魂

            二維圖形庫(kù)。云風(fēng)大哥的成名之作。雖然不代表其最高水平(最高水平作為商業(yè)代碼保存在廣州網(wǎng)易互動(dòng)的SVN里呢),但是也可以一仰風(fēng)采了。

             

            圣劍英雄傳

            二維RPG。幾個(gè)作者已成為成都錦天的主力程序員。錦天的老總從一百萬(wàn)發(fā)家,三年時(shí)間身價(jià)過(guò)億,也是一代梟雄了。這份代碼作為幾年前的學(xué)生作品也算可以了,因?yàn)橐粋€(gè)工程講究的是四平八穩(wěn),并不一定要哪個(gè)模塊多么出彩。反正我是沒(méi)有時(shí)間寫(xiě)這么一個(gè)東東,連個(gè)美工都找不到,只能整天想著破解別人的資源(^-^)。

             

            Boost

            C++準(zhǔn)標(biāo)準(zhǔn)庫(kù),我想更多的時(shí)候可以參考學(xué)習(xí)其源代碼。

             

            Yake

            我遇到的最好的輕量級(jí)游戲框架了。在以前把一個(gè)工程中的圖形引擎從Irrlicht換成OGRE的嘗試中,遇到了它。OGRE的周邊工程在我看來(lái)都很庸腫,沒(méi)有完善文檔的情況下看起來(lái)和Linux內(nèi)核差不多。不過(guò)這個(gè)Yake引擎倒是很喜歡。它以一個(gè)FSM有限狀態(tài)機(jī)作為實(shí)時(shí)程序的調(diào)度核心,然后每個(gè)模塊:物理、圖形、網(wǎng)絡(luò)、腳本、GUI、輸入等等都提供一個(gè)接口,接口之下再提供到每種具體開(kāi)源引擎的接口,然后再接具體引擎。通過(guò)這樣層層抽象,此時(shí)你是接Newton Engine,ODE還是PysX都可以;是接OGRE,Crystal Space還是Irrlicht都可以;是接RakNet還是LibCurl都可以;是接Python,Lua還是Ruby都可以,是接CEGUI還是others,是接OIS還是others(呵呵,記不起來(lái)others)都可以。所以Yake本質(zhì)上不是OGRE的周邊。雖然用Neoengine的人都倒向了它,但是現(xiàn)在版本還很早。特別是我認(rèn)為,學(xué)習(xí)研究時(shí)一定要有這種抽象之抽象,接口之接口的東西把思維從具體的綁定打開(kāi),而開(kāi)發(fā)時(shí)抽象要有限度的,就像蔡學(xué)鏞在《Java夜未眠》中講的,面向?qū)ο笥玫眠^(guò)濫也會(huì)得OOOO(面向?qū)ο筮^(guò)敏強(qiáng)迫癥)

             

            Quake Doom系列

            據(jù)說(shuō)很經(jīng)典,卡馬克這種開(kāi)源的黑客精神就值得贊許。把商業(yè)源代碼放出來(lái),走自己的創(chuàng)新之路,讓別人追去吧。不過(guò)QuakeUnreal引擎的三維編輯器是現(xiàn)在所有編輯器的鼻祖,看來(lái)要好好看看了。

             

            Nvidia SDK 9.X

            三維圖形編程的大寶庫(kù),這些Diret3DOpenGL的示例程序都是用來(lái)展示其最新的顯卡技術(shù)的。硬件廠商往往對(duì)軟件產(chǎn)品不甚在意,源代碼給你看,東西給你用去吧,學(xué)完了還得買(mǎi)我的硬件。Intel的編譯器,PhysX物理引擎大概也都是這樣。Havok會(huì)把它的Havok物理引擎免費(fèi)給別人用嗎?別說(shuō)試用版,連個(gè)Demo都看不到。所以這套SDK的內(nèi)容可比MS DirectX SDK里面那些入門(mén)級(jí)的示例酷多了,反正我是如獲至寶,三月不知愁滋味。不過(guò)顯卡要so-so哦。我的GeForce 6600有兩三個(gè)跑不過(guò)去,差強(qiáng)人意。

             

            三、網(wǎng)站:

            www.CSDN.net

            程序員大本營(yíng)吧,軟文與“新技術(shù)秀”討厭了點(diǎn),blog和社區(qū)是精華之所在。

             

            www.GameRes.com

            游戲程序員基地,文檔庫(kù)中還有點(diǎn)東西。投稿的接收者Seabug與圣劍英雄傳的主程Seabug會(huì)是同一個(gè)人嗎?一個(gè)在成都錦天擔(dān)當(dāng)技術(shù)重?fù)?dān)的高手還有時(shí)間維護(hù)網(wǎng)站嗎?我不得而知。

             

            “何苦做游戲”網(wǎng)站

            名字很個(gè)性,站長(zhǎng)也是歷盡幾年前產(chǎn)業(yè)發(fā)展初期的艱難才出此名字。

             

            www.66rpg.com

            二維游戲圖片資源很多,站長(zhǎng)柳柳主推的RPGMaker 軟件也可以玩一玩吧,但對(duì)于專(zhuān)業(yè)開(kāi)發(fā)者來(lái)說(shuō)不可當(dāng)真。

             

            www.GameDev.net

            論壇中有不少熱心的國(guó)外高手在活動(dòng)。

             

            www.SourceForge.net

            不用說(shuō)了,世界最大的開(kāi)源代碼庫(kù),入金山怎可空手而返?看到國(guó)外那些學(xué)生項(xiàng)目動(dòng)不動(dòng)就像模像樣的。(DirectX的稚形就是英國(guó)的學(xué)生項(xiàng)目,在學(xué)校還被判為不合格。)

             

            www.koders.com

            源代碼搜索引擎,支持正則表達(dá)式,google Lab中也有。當(dāng)你某種功能寫(xiě)不出來(lái)時(shí),可以看一下開(kāi)源代碼怎么寫(xiě)的,當(dāng)然不過(guò)是僅供參考,開(kāi)源代碼未必都有產(chǎn)品級(jí)的強(qiáng)度。說(shuō)到google,可看《Google Power Tools Bible》一書(shū),你會(huì)發(fā)現(xiàn),google的眾多產(chǎn)品原來(lái)也有這么多使用門(mén)道。

             

            這篇小文足足寫(xiě)了一天半的時(shí)間,不由得使我對(duì)侯捷一樣的技術(shù)作家長(zhǎng)期伏案辛勤勞作深深敬佩了??磥?lái)對(duì)于書(shū)籍或者軟件,都應(yīng)該尊重作者或者programmer的才智勞動(dòng)

            posted @ 2008-12-26 00:29 kzhang 閱讀(1537) | 評(píng)論 (2)編輯 收藏

            主題索引:

            一、剖析C++標(biāo)準(zhǔn)庫(kù)智能指針(std::auto_ptr)
               
                1.Do you Smart Pointer?
                2.std::auto_ptr的設(shè)計(jì)原理
                3.std::auto_ptr高級(jí)使用指南
                4.你是否覺(jué)得std::auto_ptr還不夠完美?

            二、C++條件,尋找構(gòu)造更強(qiáng)大的智能指針(Smart Pointer)的
                策略
               
                1.支持引用記數(shù)的多種設(shè)計(jì)策略
                2.支持處理多種資源
                3.支持Subclassing
                4.支持多線程條件下,線程安全的多種設(shè)計(jì)策略
                5.其它多種特殊要求下,再構(gòu)造

            三、Generic Programming基礎(chǔ)技術(shù)和Smart Pointer
                1.回首處理資源中的Traits技術(shù)
                2.回首多線程支持的設(shè)計(jì)


            四、COM實(shí)現(xiàn)中,Smart Pointer設(shè)計(jì)原理


            五、著名C++庫(kù)(標(biāo)準(zhǔn)和非標(biāo)準(zhǔn))中的Smart Pointer現(xiàn)狀

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


            一、剖析C++標(biāo)準(zhǔn)庫(kù)智能指針(std::auto_ptr)
               
                1.Do you Smart Pointer?

                  Smart Pointer,中文名:智能指針, 舶來(lái)品?
                  不可否認(rèn),資源泄露(resource leak)曾經(jīng)是C++程序的一大噩夢(mèng).垃圾回收
                  機(jī)制(Garbage Collection)一時(shí)頗受注目.然而垃圾自動(dòng)回收機(jī)制并不能
                  滿足內(nèi)存管理的即時(shí)性和可視性,往往使高傲的程序設(shè)計(jì)者感到不自在.
                  況且,C++實(shí)現(xiàn)沒(méi)有引入這種機(jī)制.在探索中,C++程序員創(chuàng)造了鋒利的
                  "Smart Pointer".一定程度上,解決了資源泄露問(wèn)題.

                  也許,經(jīng)常的,你會(huì)寫(xiě)這樣的代碼:
                  //x擬為class:
                  //            class x{
                  //            public:       
                  //                   int m_Idata;
                  //            public:
                  //                   x(int m_PARAMin):m_Idata(m_PARAMin){}
                  //                   void print(){ cout<<m_Idata<<endl; }
                  //            .....
                  //            }
                  //
                  void fook(){
                  x* m_PTRx = new A(m_PARAMin);
                  m_PTRx->DoSomething();     //#2
                  delete m_PTRx;
                  }

                  是的,這里可能沒(méi)什么問(wèn)題.可在復(fù)雜、N行、m_PTRclassobj所指對(duì)象生命周
                  期要求較長(zhǎng)的情況下,你能保證你不會(huì)忘記delete m_PTRclassobj嗎?生活中,
                  我們往往不應(yīng)該有太多的口頭保證,我們需要做些真正有用的東西.還有一個(gè)
                  更敏感的問(wèn)題:異常.假如在#2方法執(zhí)行期異常發(fā)生,函數(shù)執(zhí)行終止,那么new
                  出的對(duì)象就會(huì)泄露.于是,你可能會(huì)說(shuō):那么就捕獲異常來(lái)保證安全性好了.
                  你寫(xiě)這樣的程式:

                  void fook(){
                  A* m_PTRx = new A(m_PARAMin);
                  try{
                      m_PTRx->DoSomething();
                  }
                  catch(..){
                      delete m_PTRx;
                      throw;
                  }
                  delete m_PTRx;
                  }
                  哦!天哪!想象一下,你的系統(tǒng),是否會(huì)象專(zhuān)為捕獲異常而設(shè)計(jì)的.

                  一天,有人給你建議:"用Smart Pointer,那很安全.".你可以這樣重寫(xiě)你的程序:
               
                  void fook(){
                  auto_ptr<x> m_SMPTRx(new x(m_PARAMin));
                  m_SMPTRx->DoSomething();
                  }

                  OK!你不太相信.不用delete嗎?
                  是的.不用整天提心吊膽的問(wèn)自己:"我全部delete了嗎?",而且比你的delete
                  策略更安全.

                  然后,還有人告訴你,可以這樣用呢:
                  ok1.
                  auto_ptr<x> m_SMPTR1(new x(m_PARAMin));
                  auto_ptr<x> m_SMPTR2(m_SMPTR1);  //#2
                  May be you can code #2 like this :
                      auto_ptr<x> m_SMPTR2;
                      m_SMPTR2 = m_SMPTR1;     
                  ok2.
                  auto_ptr<int> m_SMPTR1(new int(32));
                 
                  ok3.
                  auto_ptr<int> m_SMPTR1;
                  m_SMPTR1 = auto_ptr<int>(new int(100));
                  也可以:
                  auto_ptr<int> m_SMPTR1(auto_ptr<int>(new int(100)));
                 
                  ok4.
                  auto_ptr<x> m_SMPTR1(new x(m_PARAMin));
                  m_SMPTR1.reset(new x(m_PARAMin1));
                 
                  ok5.
                  auto_ptr<x> m_SMPTR1(new x(m_PARAMin));
                  auto_ptr<x> m_SMPTR2(m_SMPTR.release());
                  cout<<(*m_SMPTR2).m_Idata<<endl; 
                 
                  ok6.
                  auto_ptr<int> fook(){
                  return auto<int>(new int(100));
                  }
             
                  ok7.............and so on
                 
                  但不可這樣用:
                 
                  no1.  
                  char* chrarray = new char[100];
                  strcpy(chrarray,"I am programming.");
                  auto_ptr<char*> m_SMPTRchrptr(chrarray);
                  //auto_ptr并不可幫你管理數(shù)組資源    
                  
                  no2.
                  vector<auto_ptr<x>> m_VECsmptr;
                  m_VECsmptr.push_back(auto_ptr<int>(new int(100)));
                  //auto_ptr并不適合STL內(nèi)容.
                  
                  no3.
                  const auto_ptr<x> m_SMPTR1(new x(100));
                  auto_ptr<x> m_SMPTR(new x(200));
                 
                  no4.
                  x m_OBJx(300);
                  auto_ptr<x> m_SMPTR(&m_OBJx);
                 
                  no5
                  x* m_PTR = new x(100);
                  auto_ptr<x> m_SMPTR = m_pTR;
                 
                  no6..........and so on

                  預(yù)先提及所有權(quán)的問(wèn)題,以便下面帶著疑問(wèn)剖析代碼?

                  power1.
                  auto_ptr<x> m_SMPTR1(new x(100));
                  auto_ptr<x> m_SMPTR2 = m_SMPTR1;
                  m_SMPTR2->print();
                  //輸出:100.
                  m_SMPTR1->print();
                  //!! 非法的.

                  power2.
                  auto_ptr<x> m_SMPTR(new x(100));
                 
                  auto_ptr<x> returnfun(auto_ptr<x> m_SMPTRin){
                  return m_SMPTRin;
                  }
                 
                  auto_ptr<x> = returnfun(m_SMPTR);  //#5

                  //在上面的#5中,我要告訴你對(duì)象所有權(quán)轉(zhuǎn)移了兩次.
                  //什么叫對(duì)象所有權(quán)呢?
              
                2. std::auto_ptr的設(shè)計(jì)原理
                  
                  上面的一片正確用法,它們?cè)诟尚┦裁?
                        一片非法,它們犯了什么罪?
                        一片什么所有權(quán)轉(zhuǎn)移,它的內(nèi)部機(jī)智是什么?
                  哦!一頭霧水?下面我們就來(lái)剖析其實(shí)現(xiàn)機(jī)制.
                  基礎(chǔ)知識(shí):
                          a.智能指針的關(guān)鍵技術(shù):在于構(gòu)造棧上對(duì)象的生命期控制
                            堆上構(gòu)造的對(duì)象的生命期.因?yàn)樵谥悄苤羔樀膬?nèi)部,存儲(chǔ)
                            著堆對(duì)象的指針,而且在構(gòu)析函數(shù)中調(diào)用delete行為.
                            大致機(jī)構(gòu)如下:
                            x* m_PTRx = new x(100);//#1
                            template<typename T>
                            auto_ptr{
                            private:
                            T* m_PTR;//維護(hù)指向堆對(duì)象的指針,在auto_ptr定位后    
                            ....     //它應(yīng)該指向#1構(gòu)造的對(duì)象,即擁有所有權(quán).
                            ~auto(){ delete m_PTR; }
                            ....
                            }
                         b.所有權(quán)轉(zhuǎn)移之說(shuō)
                           上面曾有一非法的程式片段如下:
                           auto_ptr<x> m_SMPTR1(new x(100));
                           auto_ptr<x> m_SMPTR2 = m_SMPTR1;
                           m_SMPTR2->print();
                           //輸出:100.
                           m_SMPTR1->print();
                           //!! 非法的.
                           按常理來(lái)說(shuō),m_SMPTR->print();怎么是非法的呢?
                           那是因?yàn)楸緛?lái),m_SMPTR1維護(hù)指向new x(100)的指針,
                           可是m_SMPTR2 = m_SMPTR1;auto_ptr內(nèi)部機(jī)制使得m_SMPTR1將對(duì)象的地址
                           傳給m_SMPTR2,而將自己的對(duì)象指針置為0.
                           那么自然m_SMPTR->print();失敗.
                           這里程序設(shè)計(jì)者要負(fù)明顯的職責(zé)的.
                           那么auto_ptr為什么采取這樣的策略:保證所有權(quán)的單一性.
                                                           亦保證了系統(tǒng)安全性.
                           如果多個(gè)有全權(quán)的auto_ptr維護(hù)一個(gè)對(duì)象,那么在你消除一個(gè)
                           auto_ptr時(shí),將導(dǎo)致多個(gè)auto_ptr的潛在危險(xiǎn).
                 
                   下面我們以SGI-STL的auto_ptr設(shè)計(jì)為樣本(去掉了無(wú)關(guān)分析的宏),來(lái)剖析其原理.
                   #1  template <class _Tp> class auto_ptr {
                   #2  private:
                   #3  _Tp* _M_ptr;  //定義將維護(hù)堆對(duì)象的指針

                   #4  public:
                   #5  typedef _Tp element_type;  //相關(guān)類(lèi)型定義
                   #6  explicit auto_ptr(_Tp* __p = 0) __STL_NOTHROW : _M_ptr(__p) {}
                   #7  auto_ptr(auto_ptr& __a) __STL_NOTHROW : _M_ptr(__a.release()) {}
                   #8  template <class _Tp1> auto_ptr(auto_ptr<_Tp1>& __a) __STL_NOTHROW
                                                             : _M_ptr(__a.release()) {}
                       //#6、#7、#8是auto_ptr構(gòu)造函數(shù)的三個(gè)版本.
                       //#6注釋?zhuān)簜魅雽?duì)象的指針,構(gòu)造auto_ptr.explicit關(guān)鍵字:禁止隱式轉(zhuǎn)換.
                       //        這就是ok2正確,而no5(隱式轉(zhuǎn)換)錯(cuò)誤的原因.
                       //#7注釋?zhuān)嚎截悩?gòu)造函數(shù).
                       //        傳入auto_ptr實(shí)例,構(gòu)造auto_ptr. ok1、ok3使用了這個(gè)構(gòu)造式.
                       //        它是一個(gè)很關(guān)鍵的構(gòu)造函數(shù),在具體情況下,我們?cè)俜治?br>           //#8注釋?zhuān)篴uto_ptr的模板成員,可在繼承對(duì)象重載的基礎(chǔ)上,實(shí)現(xiàn)特殊功能.
                       //  
                       //   舉例:
                       //   class A{ public:
                       //          virtual void fook(){cout<<"I am programming"<<endl;
                       //          /*..........*/                                   };
                       //   class B : public A {
                       //          virtual void fook(){ cout<<"I am working"<<endl;
                       //         /*...........*/                                  }; 
                       //   auto_ptr<A> m_SMPTRa(new A(33));//實(shí)質(zhì):
                       //   auto_ptr<B> m_SMPTRb(m_SMPTRa); //基類(lèi)的指針可以賦給派生類(lèi)的指針         
                       //             
                       //   auto_ptr<B> m_SMPTRb(new B(44));//實(shí)質(zhì):
                       //   auto_ptr<A> m_SMPTRa(m_SMPTRb); //派生類(lèi)的指針不可賦給基類(lèi)的指針
                       //      
                       //   auto_ptr<A> m_SMPTRa(new B(33));  // ok! 
                       //   m_SMPTRa->fook()將調(diào)用派生類(lèi)B的fook()
                       //   m_SMPTRa->A::fook()將調(diào)用基類(lèi)A的fook()
                       //   
                       //   auto_ptr<B> m_SMPTRb(new A(33));  // wrong!
                       //  
                       //  
                   #9  auto_ptr& operator=(auto_ptr& __a) __STL_NOTHROW {
                   #10 if (&__a != this) { delete _M_ptr;  _M_ptr = __a.release(); }
                   #11 return *this;
                   #12 }
                    
                   #13 template <class _Tp1>
                   #14 auto_ptr& operator=(auto_ptr<_Tp1>& __a) __STL_NOTHROW {
                   #15 if (__a.get() != this->get()) { delete _M_ptr; _M_ptr = __a.release(); }
                   #16 return *this;
                   #16 } 
                      //
                      // #9~~#16 兩個(gè)版本的指派函數(shù).
                      //         delete _M_ptr; 在指派前,銷(xiāo)毀原維護(hù)的對(duì)象.
                      //         _a.release() ; release操作,詳細(xì)代碼參見(jiàn)#20~~#23.
                      //                        用于*this獲得被指派對(duì)象,
                      //                        且將原維護(hù)auto_ptr置空.
                      //     no3使用了第一種指派.
                      //     而權(quán)限轉(zhuǎn)移正是_a.release()的結(jié)果.
                     
                   #17 ~auto_ptr() __STL_NOTHROW { delete _M_ptr; }
                      //構(gòu)析函數(shù).消除對(duì)象.注意這里對(duì)對(duì)象的要求!
                     
                   #17 _Tp& operator*() const __STL_NOTHROW {  return *_M_ptr; }
                   #18 _Tp* operator->() const __STL_NOTHROW { return _M_ptr;  }
                   #19 _Tp* get() const __STL_NOTHROW { return _M_ptr; }
                     //
                     //  操作符重載.
                     // #17注釋?zhuān)禾犷I(lǐng)操作(dereference),獲得對(duì)象. 見(jiàn)ok5用法.
                     // #18注釋?zhuān)撼蓡T運(yùn)算符重載,返回對(duì)象指針.
                     // #19注釋?zhuān)浩胀ǔ蓡T函數(shù).作用同于重載->運(yùn)算符
                     //
                   #20 _Tp* release() __STL_NOTHROW {
                   #21 _Tp* __tmp = _M_ptr;
                   #22 _M_ptr = 0;
                   #23 return __tmp;                }
                     //上面已經(jīng)詳解     
             
                   #24 void reset(_Tp* __p = 0) __STL_NOTHROW {
                   #25 delete _M_ptr;
                   #26 _M_ptr = __p;                          }
                     //
                     //傳入對(duì)象指針,改變auto_ptr維護(hù)的對(duì)象
                     //       且迫使auto_ptr消除原來(lái)維護(hù)的對(duì)象
                     //       見(jiàn)ok3用法.

                     // According to the C++ standard, these conversions are required.  Most
                     // present-day compilers, however, do not enforce that requirement---and,
                     // in fact, most present-day compilers do not support the language
                     // features that these conversions rely on.
                    
                     //下面這片段用于類(lèi)型轉(zhuǎn)化,目前沒(méi)有任何編譯器支持
                     //具體技術(shù)細(xì)節(jié)不訴.         

                     #ifdef __SGI_STL_USE_AUTO_PTR_CONVERSIONS

                  #27 private:
                  #28 template<class _Tp1>
                  #29 struct auto_ptr_ref { _Tp1* _M_ptr; auto_ptr_ref(_Tp1* __p) : _M_ptr(__p) {}
                                         };

                  #30 public:
                  #31 auto_ptr(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW
                                           : _M_ptr(__ref._M_ptr) {}
                  #32 template <class _Tp1>
                  #33 operator auto_ptr_ref<_Tp1>() __STL_NOTHROW
                  #34 { return auto_ptr_ref<_Tp>(this->release()); }
                  #35 template <class _Tp1> operator auto_ptr<_Tp1>() __STL_NOTHROW
                  #36 { return auto_ptr<_Tp1>(this->release()); }
                  #37 #endif /* __SGI_STL_USE_AUTO_PTR_CONVERSIONS */
                  #38 };
                 
                  OK!就是這樣了.
                  正如上面原理介紹處敘說(shuō),
                  你需要正視兩大特性:
                  1.構(gòu)造棧對(duì)象的生命期控制堆上構(gòu)造的對(duì)象的生命期
                  2.通過(guò)release來(lái)保證auto_ptr對(duì)對(duì)象的獨(dú)權(quán).
                 
                 在我們對(duì)源碼分析的基礎(chǔ)上,重點(diǎn)看看:
                 no系列錯(cuò)誤在何處?
                 no1.
                     我們看到構(gòu)析函數(shù)template<class _Tp>
                                     ~auto_ptr() _STL_NOTHROW
                                    { delete _M_ptr; }
                     所以它不能維護(hù)數(shù)組,
                     維護(hù)數(shù)組需要操作:delete[] _M_ptr;
                 no2.
                    先提部分vector和auto_ptr代碼:
                    a.提auto_ptr代碼
                     
                    auto_ptr(auto_ptr& __a) __STL_NOTHROW : _M_ptr(__a.release()) {}
                   
                    b.提vector代碼
                     
                      Part1:
                      void push_back(const _Tp& __x) {
                      if (_M_finish != _M_end_of_storage) {
                      construct(_M_finish, __x);
                      ++_M_finish;
                      }
                      else
                     _M_insert_aux(end(), __x);
                      }
                   
                     Part2:
                     template <class _T1, class _T2>
                     inline void construct(_T1* __p,

                     //++++++++++++++++++++++++++++++++
                     //         const _T2& __value) { +
                     //++++++++++++++++++++++++++++++++
                     //  new (__p) _T1(__value);      +
                     //++++++++++++++++++++++++++++++++

                     }
                    
                     Part3.
                     template <class _Tp, class _Alloc>
                     void
                     vector<_Tp, _Alloc>::_M_insert_aux
                     (iterator __position,

                      //++++++++++++++++++++++++++++++++
                      //        const _Tp& __x)       ++
                      //++++++++++++++++++++++++++++++++  
             
                     {
                     if (_M_finish != _M_end_of_storage) {
                     construct(_M_finish, *(_M_finish - 1));
                     ++_M_finish;

                     //++++++++++++++++++++++++++++++++
                     //     _Tp __x_copy = __x;       +
                     //++++++++++++++++++++++++++++++++

                     copy_backward(__position, _M_finish - 2, _M_finish - 1);
                     *__position = __x_copy;
                     }
                     else {
                     const size_type __old_size = size();
                     const size_type __len = __old_size != 0 ? 2 * __old_size : 1;
                     iterator __new_start = _M_allocate(__len);
                     iterator __new_finish = __new_start;
                     __STL_TRY {
                     __new_finish = uninitialized_copy
                     (_M_start, __position, __new_start);
                     construct(__new_finish, __x);
                     ++__new_finish;
                     __new_finish = uninitialized_copy
                    (__position, _M_finish, __new_finish);
                    }
                    __STL_UNWIND((destroy(__new_start,__new_finish),
                              _M_deallocate(__new_start,__len)));
                   destroy(begin(), end());
                   _M_deallocate(_M_start, _M_end_of_storage - _M_start);
                   _M_start = __new_start;
                   _M_finish = __new_finish;
                   _M_end_of_storage = __new_start + __len;
                   }
                   }

                   從提取的vector代碼,Part1可看出,push_back的操作行為.
                   兵分兩路,可是再向下看,你會(huì)發(fā)現(xiàn),無(wú)一例外,都
                   通過(guò)const _Tp& 進(jìn)行拷貝行為,那么從auto_ptr提出的片段就
                   派上用場(chǎng)了.
                   可你知道的,auto_ptr總是堅(jiān)持對(duì)對(duì)象的獨(dú)權(quán).那必須修改
                   原來(lái)維護(hù)的對(duì)象,而vector行為要求const _Tp&,這樣自然會(huì)產(chǎn)生
                   問(wèn)題.一般編譯器是可以發(fā)覺(jué)這種錯(cuò)誤的.

                   其實(shí),STL所有的容器類(lèi)都采用const _Tp&策略.
             
                   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                  + 看了sutter和Josuttis的兩篇文章中,都提及:                    +
                  + STL容器不支持auto_ptr原因在于copy的對(duì)象只是獲得所有權(quán)的對(duì)象, +
                  + 這種對(duì)象不符合STL的要求.可是本人總感覺(jué)即時(shí)不是真正的復(fù)制對(duì)象,+
                  + 但我用vector<auto_ptr<x> >的目的就在于維護(hù)對(duì)象,并不在乎      +
                  + 所謂的完全對(duì)象.而且我用自己寫(xiě)的Smart Pointer配合STL容器工作, +
                  + 很正常.那需要注意的僅僅是const問(wèn)題.                          +
                  +                                                              +
                  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

                 no3.
                    這個(gè)也是auto_ptr隱含的所有權(quán)問(wèn)題引起的.
                    const auto_ptr不允許修改.
                    隨便提及:const對(duì)象不代表對(duì)象一點(diǎn)不可以改變.
                              在兩種const語(yǔ)義下,都有方法修改對(duì)象或?qū)ο髢?nèi)部指針維護(hù)的對(duì)象
                             或其它資源.
                 no4.
                    再看auto_ptr的構(gòu)析函數(shù).
                    delete不可以消除棧上資源.

                 no5.
                    依賴傳入對(duì)象指針的構(gòu)造函數(shù)被聲明為explicit,禁止隱式轉(zhuǎn)換.

               
                3.auto_ptr高級(jí)使用指南
                 
                  a.類(lèi)成員auto_ptr,禁止構(gòu)造函數(shù)以構(gòu)建"完全對(duì)象"
                    Programme1:
                    struct Structx{
                           int m_Idata;
                           char m_CHRdata;
                           /* and so on */
                    };
                    出于對(duì)象編程的理念,
                    我們將Structx打造成包裹類(lèi):
                    class StructWrapper{
                    private:
                    Structx* m_STRTxptr;
                    public:
                    StructWrapper():m_STRTxptr(new Structx){}
                    ~StructWrapper(){delete m_SMRTxptr; }
                    public:
                    void Soperator1(){ /* 針對(duì)Structx對(duì)象的特性操作 */}
                    void Soperator2(){ /* 針對(duì)Structx對(duì)象的特性操作 */}       
                    /*  and so on */
                    };
                   
                    Programme2:
                    class StructWrapper{
                    private:
                    auto_ptr<Structx> m_SMPTRx;
                    public:
                    StructWrapper():m_SMPTRAx(new Structx){}
                    public:
                    void Soperator1(){ /* 針對(duì)Structx對(duì)象的特性操作 */}
                    void Soperator2(){ /* 針對(duì)Structx對(duì)象的特性操作 */}       
                    /*  and so on */
                    };
                   
                    Programme3:
                    StructWrapper::StructWrapper(const StructWrapper& other)
                    : M_SMPTRx(new Struct(*other.m_SMPTRx)) { }
                    StructWrapper& StructWrapper::operator=(const StructWrapper &other){
                    *m_SMPTRx = *other.m_SMPTRx;
                    };

                    處于對(duì)構(gòu)建于堆中的對(duì)象(new Structx)智能維護(hù)的需要.
                    我們將programme1改造為programme2:
                    不錯(cuò),對(duì)象是可以智能維護(hù)了.
                    對(duì)于包裹類(lèi)(StructWrapper)你是否會(huì)有這樣的構(gòu)造或指派操作:
                     StructWrapper m_SMPTRWrapper2(m_SMPTRWrapper1);
                  
                     StructWrapper mSMPTRWrapper2 = m_SMPTRWrapper1;
                     那么請(qǐng)注意:
                     當(dāng)你坦然的來(lái)一個(gè):M_SMPTRWrapper1->Soperator1();的時(shí)候,
                     系統(tǒng)崩潰了.
                     不必驚訝,所有權(quán)還是所有權(quán)問(wèn)題.
                     問(wèn)一下自己:當(dāng)programme2默認(rèn)拷貝構(gòu)造函數(shù)作用時(shí),又調(diào)用了auto_ptr的
                     默認(rèn)構(gòu)造函數(shù),那么auto_ptr所有的默認(rèn)行為都遵循獨(dú)權(quán)策略.對(duì),就這樣.
                     m_SMPTRWrapper1的對(duì)象所有權(quán)轉(zhuǎn)移給了m_SMPTRWrapper2.
                     M_SMPTRWrapper1->Soperator1();那么操作變成了在NULL上的.
                     哦!系統(tǒng)不崩潰才怪.
                     那么你需要想,programme3那樣利用auto_ptr的提領(lǐng)操作符自己的
                     構(gòu)造"完全對(duì)象".

                   b.利用const關(guān)鍵字,防止不經(jīng)意的權(quán)限轉(zhuǎn)移
                    
                     從上面的敘述,你可看出,所有權(quán)轉(zhuǎn)移到處可以釀成大禍.
                     而對(duì)于一般應(yīng)用來(lái)說(shuō),獨(dú)權(quán)又是很好的安全性策略.
                     那么我們就用const來(lái)修飾auto_ptr,禁止不經(jīng)意的錯(cuò)誤.
                   
                     當(dāng)然上面提及:并不代表auto_ptr是不可修改的.
                     處于需要,從兩種const語(yǔ)義,你都可實(shí)現(xiàn)修改.

                     然,你還希望在函數(shù)傳入傳出auto_ptr那么你可傳遞auto_ptr的引用,
                     那就萬(wàn)無(wú)一失了: void fook(const auto_ptr<x>& m_PARAMin);
                     在返回后賦予其它時(shí),使用引用是不行的.你得用指針.
                     因?yàn)橐脽o(wú)論作為lvalue還是rvaluev,都會(huì)調(diào)用構(gòu)造或指派函數(shù).


                4.你是否覺(jué)得std::auto_ptr還不夠完美
                 
                  在實(shí)踐中,std::auto_ptr能滿足你的需求嗎?          
             
                  Andrei Alexandrescu在一篇文章中,提及:有關(guān)Smart Pointer的技術(shù)就像
                  巫術(shù).Smart Pointer作為C++垃圾回收機(jī)制的核心,它必須足夠強(qiáng)大的、具有工業(yè)強(qiáng)度和安全性.
                  但為了可一勞永逸我們還需要披荊斬棘繼續(xù)探索.

                  下面在需求層面上,我們思索一下我們的智能指針還需要些什么?
             
                    a. std::auto_ptr 能夠處理數(shù)組嗎?我們可以用智能指針來(lái)管理其它的資源嗎?
                       譬如一個(gè)線程句柄、一個(gè)文件句柄 and so on !
                    b. 對(duì)于我們的對(duì)象真的永遠(yuǎn)實(shí)行獨(dú)權(quán)政策嗎?
                    c. Our 智能指針還需要在繼承和虛擬層面上發(fā)揮威力 !
                    d. 往往,需要擴(kuò)展Our 智能指針的功能成員函數(shù)來(lái)滿足動(dòng)態(tài)的需要 !
                    e. 也許,你需要的還很多.

            ---------------------------------------------------------------
                                   [下續(xù)]

            二、C++條件,尋找構(gòu)造更強(qiáng)大的智能指針(Smart Pointer)的
                策略
               
                1.支持引用記數(shù)的多種設(shè)計(jì)策略
                2.支持處理多種資源
                3.支持Subclassing
                4.支持多線程條件下,線程安全的多種設(shè)計(jì)策略
                5.其它多種特殊要求下,再構(gòu)造

            三、Generic Programming基礎(chǔ)技術(shù)和Smart Pointer
                1.回首處理資源中的Traits技術(shù)
                2.回首多線程支持的設(shè)計(jì)


            四、COM實(shí)現(xiàn)中,Smart Pointer設(shè)計(jì)原理


            五、著名C++庫(kù)(標(biāo)準(zhǔn)和非標(biāo)準(zhǔn))中的Smart Pointer現(xiàn)狀

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

            --------------------------------------------------------------
                                      鄭重聲明:
                             允許復(fù)制、修改、傳遞或其它行為
                             但不準(zhǔn)用于任何商業(yè)用途.
                                  寫(xiě)于  20/3/2003
                                  最后修改: 20/3/2003
                                     By RedStar81
                                  81_RedStar@163.com
            -------------------------------------------------------------     

            posted @ 2008-09-22 00:37 kzhang 閱讀(2689) | 評(píng)論 (1)編輯 收藏
            僅列出標(biāo)題  

            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿

            隨筆分類(lèi)

            隨筆檔案

            文章分類(lèi)

            文章檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久精品国产2020| 国产国产成人精品久久| 久久久久国产一区二区| 久久精品免费网站网| 无码八A片人妻少妇久久| 久久久久亚洲AV无码观看| 99久久久精品免费观看国产| 久久综合九色综合97_久久久| 欧美日韩精品久久久久| 久久影院综合精品| 久久久久久久久久免免费精品 | 思思久久好好热精品国产| 国产69精品久久久久9999APGF | 日日狠狠久久偷偷色综合0 | 日韩欧美亚洲综合久久影院Ds| 97久久国产综合精品女不卡| 国产精品成人久久久久三级午夜电影| 久久91精品国产91久| 国产69精品久久久久99| 久久精品人成免费| 波多野结衣久久精品| 久久久久国产一区二区三区| 久久九九亚洲精品| 国内精品伊人久久久久av一坑| 国产69精品久久久久9999APGF| 久久久久香蕉视频| 久久99精品久久久久久秒播| 久久综合给合久久狠狠狠97色 | 亚洲综合久久综合激情久久| 亚洲AV日韩精品久久久久久久| 亚洲性久久久影院| 久久久久无码中| 亚洲&#228;v永久无码精品天堂久久| 久久91精品国产91久久户| 久久婷婷五月综合色高清| 精品久久国产一区二区三区香蕉 | 99久久国语露脸精品国产| 色欲av伊人久久大香线蕉影院| 久久九九兔免费精品6| 欧美精品九九99久久在观看| 日韩亚洲国产综合久久久|