• <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>

            C++類庫(kù)設(shè)計(jì)的基本思想和方法

             首先說(shuō)指導(dǎo)思想。這是一個(gè)價(jià)值觀問(wèn)題,我們?cè)诖颂岢鋈龡l標(biāo)準(zhǔn):簡(jiǎn)單,高性能,可移植。

             我們?cè)陂_(kāi)篇就對(duì)簡(jiǎn)單性目標(biāo)作了敘述,這里再稍微展開(kāi)討論一下。我們提出的簡(jiǎn)單標(biāo)準(zhǔn),首先是外部接口簡(jiǎn)單,其次是內(nèi)部結(jié)構(gòu)簡(jiǎn)單。我們知道,類庫(kù)是提供給上層應(yīng)用程序使用的,也就是按照一定的接口規(guī)范,向上層提供一定的功能服務(wù)。接口設(shè)計(jì)得越簡(jiǎn)單,對(duì)上層用戶來(lái)說(shuō)就越方便,就越不容易產(chǎn)生Bug。我們可以注意到,流行的成功類庫(kù)都是擁有簡(jiǎn)單接口的。為了使接口簡(jiǎn)單,常常不得不把有關(guān)具體實(shí)現(xiàn)的復(fù)雜性封裝于類庫(kù)內(nèi)部,也就是說(shuō),關(guān)于簡(jiǎn)單性的設(shè)計(jì)原則,外部接口簡(jiǎn)單優(yōu)先于內(nèi)部實(shí)現(xiàn)簡(jiǎn)單。

             

            高性能是C++語(yǔ)言優(yōu)于其它OO語(yǔ)言的一個(gè)特性。C++的高性能應(yīng)該首先歸于它運(yùn)行模式,和大多數(shù)OO語(yǔ)言不同,C++程序編譯后直接產(chǎn)生本地平臺(tái)代碼(Native Code),理論上具備了可能的最大執(zhí)行性能。另外的一個(gè)原因是主流的C++編譯器都被設(shè)計(jì)得非常精巧,具有優(yōu)越的代碼優(yōu)化能力。對(duì)于C++類庫(kù)設(shè)計(jì)者來(lái)說(shuō),保持C++的高性能是一個(gè)重要目標(biāo)。程序的高性能可以從兩方面來(lái)評(píng)價(jià),一是時(shí)間性能,以盡量短的時(shí)間來(lái)解決盡量多的業(yè)務(wù);二是資源性能,以盡量少的資源消耗,包括CPU使用、內(nèi)存占用、網(wǎng)絡(luò)流量、磁盤空間等等,來(lái)維持正常的程序功能。提高性能的主要手段是數(shù)據(jù)結(jié)構(gòu)、算法和程序體現(xiàn)結(jié)構(gòu)的優(yōu)化設(shè)計(jì)000-861 117-102 。

             

            再說(shuō)可移植性。C++的編譯后輸出代碼是本地平臺(tái)代碼,因此C++本身不具有目標(biāo)代碼可移植性,C++的可移植性只能是源代碼可移植性。源代碼的可移植性是指,同一軟件產(chǎn)品的全部或者部分源代碼可以在不同的編譯環(huán)境中進(jìn)行編譯(不需要編譯的除外),并且其結(jié)果具有相同的品質(zhì)特性(依優(yōu)先順序包括功能性、可靠性、可用性、性能性、可維護(hù)性等)。編譯環(huán)境可以大致分為三個(gè)層次,最底層的是操作系統(tǒng),也就是平臺(tái)(Platform),其次是對(duì)源代碼直接進(jìn)行處理的編譯器,然后是其它在編譯過(guò)程中必需的中間件物品,如庫(kù)文件等。我們知道C++雖然在語(yǔ)言規(guī)范上獲得了統(tǒng)一(ISO/IEC),其編譯器卻是群雄割據(jù)的局面,具有代表性的有Borland C++系列(已經(jīng)淡出市場(chǎng)),MicrosoftVisual Studio系列的C++編譯器和GNU陣營(yíng)的壓軸產(chǎn)品gc中的g++。源代碼經(jīng)編譯環(huán)境處理后產(chǎn)生的可執(zhí)行代碼的執(zhí)行平臺(tái)稱為目標(biāo)平臺(tái),不同的編譯器的目標(biāo)平臺(tái)也不同,有的支持多平臺(tái),如g++,有的是單一平臺(tái),如Visual C++。對(duì)于類庫(kù)設(shè)計(jì)者來(lái)說(shuō),想要獲得完全的可移植性是非常困難的(除非是象STL這樣被納入語(yǔ)言規(guī)范的類庫(kù),因?yàn)椴恢С?/span>STL就是不支持標(biāo)準(zhǔn)的C++。即便如此不同的編譯環(huán)境還是存在不同的STL實(shí)現(xiàn)版本,造成“一個(gè)類庫(kù)多個(gè)實(shí)現(xiàn)”的局面),我們只能有選擇地支持一部分環(huán)境。我們?cè)陂_(kāi)篇就已經(jīng)說(shuō)明,我們選擇g++Visual C++編譯器,選擇LinuxWindows 32位目標(biāo)平臺(tái)。

             

            接下來(lái)我們來(lái)討論C++類庫(kù)設(shè)計(jì)的方法論。

             

            首先,我們采用僅用頭文件的類庫(kù)設(shè)計(jì)方式(Header-onlySTL的大多數(shù)實(shí)現(xiàn)版本都是采用Header-only的方式),也就是在頭文件(.h)中聲明和定義類,將其成員函數(shù)全部定義為內(nèi)聯(lián)函數(shù),而不使用源程序文件(.cpp)。

             

            我們知道在C語(yǔ)言的開(kāi)發(fā)環(huán)境中,所謂庫(kù)文件包含兩個(gè)部分,頭文件部分和二進(jìn)制文件部分。根據(jù)二進(jìn)制文件和用戶目標(biāo)文件結(jié)合方式的不同,又可分為靜態(tài)鏈接文件和動(dòng)態(tài)鏈接文件。這種庫(kù)的構(gòu)成模式已成為事實(shí)上的C語(yǔ)言開(kāi)發(fā)環(huán)境的標(biāo)準(zhǔn),絕大多數(shù)平臺(tái)、絕大多數(shù)編譯器都使用這種模式 117-301 190-721 。

             

            然而C++語(yǔ)言開(kāi)發(fā)環(huán)境,這種庫(kù)構(gòu)成模式遭遇到一個(gè)重大問(wèn)題,就是符號(hào)命名問(wèn)題。舉例來(lái)說(shuō),C++允許多個(gè)函數(shù)可以被重載(Overload),可以具有相同的名稱,而通過(guò)參數(shù)列表不同被予以區(qū)別。這樣就帶來(lái)一個(gè)問(wèn)題,編譯完成的目標(biāo)代碼中怎樣來(lái)區(qū)別這些在源代碼中具有相同名稱的函數(shù)?常見(jiàn)的做法是在編譯器輸出的函數(shù)的符號(hào)名稱中加入描述類型信息的字符串,這種方法通常被稱為名稱裝飾(Name decoration)或者名稱糟化(Name mangling,這個(gè)術(shù)語(yǔ)真不好翻譯,筆者的感覺(jué)是發(fā)明這個(gè)詞的人覺(jué)得編譯器把本來(lái)簡(jiǎn)單干凈的符號(hào)給搞亂了)。比如說(shuō),g++3.4.4對(duì)于函數(shù)void func(int),其編譯輸出符號(hào)名稱為_Z1funci,對(duì)于函數(shù)void func(int, int),其輸出符號(hào)名稱為_Z1funcii,等等。但是,這種名稱裝飾規(guī)則沒(méi)有統(tǒng)一規(guī)范,也就是說(shuō)不同的編譯器有各自不同的名稱裝飾規(guī)則,這樣就導(dǎo)致不同的C++編譯器只能識(shí)別自己的輸出文件,而沒(méi)有辦法處理其他編譯器的輸出文件。因此,如果將C++程序制作成二進(jìn)制的庫(kù)文件,則其能夠支持的開(kāi)發(fā)環(huán)境只能限于原始的開(kāi)發(fā)環(huán)境,基本上不具有多種開(kāi)發(fā)環(huán)境間的通用性。

             

            一個(gè)解決辦法是將庫(kù)文件保持在源代碼形態(tài)(包括頭文件和源文件),而不編譯成二進(jìn)制文件。比如STL的許多實(shí)現(xiàn)版本都是以頭文件形式存在。這樣雖然解決了名稱裝飾所帶來(lái)的不可移植問(wèn)題,但同時(shí)又會(huì)帶來(lái)代碼編譯時(shí)間增長(zhǎng),源代碼完全公開(kāi)等問(wèn)題。在C++的名稱裝飾規(guī)則未被統(tǒng)一之前,看起來(lái)這個(gè)問(wèn)題是很難兩全其美地解決了。

             

            在本系列中,我們也仿照g++STL實(shí)現(xiàn)方式,完全以頭文件形式來(lái)編寫類庫(kù)。為什么不把代碼放到源文件中去呢?主要原因是,頭文件只需要用戶使用包含指令(#include)就可以處理了,而源文件則需要配置到用戶工程的編譯目標(biāo)列表中,和用戶的源程序形成共同編譯的形式,破壞了用戶工程的編譯目標(biāo)的封閉性,比較麻煩而且不符合軟件開(kāi)發(fā)的一般習(xí)慣。

             

            其次我們來(lái)討論如何支持多平臺(tái)。我們已經(jīng)說(shuō)過(guò)在本系列中我們的線程庫(kù)支持Linux平臺(tái)的Posix線程和Windows 32位平臺(tái)的線程模式。我們可以參考C++Pimpl“慣語(yǔ)”(Pimpl idiom,在Herb Sutter的《Exceptional C++》中有介紹),采用2層類構(gòu)造方式。上次類亦即接口類,為用戶提供統(tǒng)一的類接口,在用戶看來(lái)具有唯一的類行為定義;下層類亦即實(shí)現(xiàn)類,將接口類的行為定義轉(zhuǎn)化為某個(gè)平臺(tái)的具體實(shí)現(xiàn)。

            posted on 2008-01-11 15:53 lovetiffany 閱讀(4615) 評(píng)論(29)  編輯 收藏 引用

            評(píng)論

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法[未登錄](méi) 2008-01-12 17:55 len

            這個(gè)文章是系列的嗎,使原創(chuàng)還是翻譯的  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2009-10-21 13:51 網(wǎng)絡(luò)監(jiān)控

            "頭文件的類庫(kù)設(shè)計(jì)方式"有什么優(yōu)點(diǎn)?對(duì)于一些比較復(fù)雜的類豈不是頭文件很大  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2010-06-06 00:35 Clare21Pugh

            All people deserve wealthy life and <a href="http://lowest-rate-loans.com">loan</a> or just auto loan can make it much better. Because people's freedom is based on money state.   回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2011-08-07 09:02 blog posting service

            Some time before I was wanting to know about optimization. At this moment I realize that blog posting supposes to be extra important for my website. Thence, I decided to use the blog posting service.   回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2011-11-23 01:56 Web Design

            比較麻煩而且不符合軟件開(kāi)發(fā)的一般習(xí)慣。  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2011-12-17 01:09 best joomla hosting

            也就是說(shuō),關(guān)于簡(jiǎn)單性的設(shè)計(jì)原則,外部接口簡(jiǎn)單優(yōu)先于內(nèi)部實(shí)現(xiàn)簡(jiǎn)單。<a href="http://www.joomlahostings.org/">best joomla hosting</a>  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2011-12-20 15:02 Latest news

            類庫(kù)多個(gè)實(shí)現(xiàn)”的局面),我們只能有選擇地支持一部分環(huán)境。我們?cè)陂_(kāi)篇就已經(jīng)說(shuō)明,我們選擇g++和Visual C++編譯器,選擇Linux和Windows 32位目標(biāo)平臺(tái)。  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2011-12-22 17:42 free casino games

            集成到MSDN的Wiki是一個(gè)極好的主意。這實(shí)在是太像MS公司做到這一點(diǎn)的風(fēng)險(xiǎn),但我認(rèn)為,從長(zhǎng)遠(yuǎn)來(lái)看將支付。好樣的!  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2011-12-23 21:47 Online dating

            最底層的是操作系統(tǒng),也就是平臺(tái)(Platform),其次是對(duì)源代碼直接進(jìn)行處理的編譯器,  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2011-12-24 01:23 tinnitus treatment

            C + +中繼續(xù)使用,是首選的編程語(yǔ)言之一,以開(kāi)發(fā)專業(yè)應(yīng)用  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2012-01-02 15:31 milk

            常困難的(除非是象STL這樣被納入語(yǔ)言規(guī)范的類庫(kù),因?yàn)椴恢С諷TL就是不支持標(biāo)準(zhǔn)的C++。即便如此不同的編譯環(huán)境還是存在不同的STL實(shí)現(xiàn)版本,造成“一個(gè)類庫(kù)多個(gè)實(shí)現(xiàn)”的局面),我  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2012-01-24 00:08 colon cleanse reviews

            作為增強(qiáng)到C語(yǔ)言開(kāi)始  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2012-01-24 00:11 gout cure

            C + +中有時(shí)也被稱為混合語(yǔ)言.  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2012-01-24 00:14 hemorrhoid relief

            C + +中繼續(xù)使用,是首選的編程語(yǔ)言之一,以開(kāi)發(fā)專業(yè)應(yīng)用  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2012-01-28 02:15 buy wartrol

            你真的已經(jīng)搭上了眾多關(guān)注的目光似乎  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2012-03-17 02:56 vps hosting

            的C ++繼續(xù)使用和開(kāi)發(fā)專業(yè)應(yīng)用首選的編程語(yǔ)言之一。  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2012-03-23 02:01 hostgator coupon

            前身的Visual C++被稱為微軟的C / c ++  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2012-08-09 20:07 History of crap

            我們只能有選擇地支持一部分環(huán)境。我們?cè)陂_(kāi)篇就已經(jīng)說(shuō)明,我們選擇g++和Visual C++編譯器  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2012-08-14 22:25 Search Engine Optimization

            ,也就是說(shuō),關(guān)于簡(jiǎn)單性的設(shè)計(jì)原則,外部接口簡(jiǎn)單優(yōu)先于內(nèi)部實(shí)現(xiàn)簡(jiǎn)單。  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2012-09-21 17:11 mobile me

            我們只能有選擇地支持一部分環(huán)境。我們?cè)陂_(kāi)篇就已經(jīng)說(shuō)明,我們選擇g++和Visual C++編譯器   回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2012-09-28 22:01 payday loans

            、網(wǎng)絡(luò)流量、磁盤空間等等,來(lái)維持正常的程序功能。提高性能的主要手段是數(shù)據(jù)結(jié)構(gòu)、算法和程序體現(xiàn)結(jié)構(gòu)的優(yōu)化設(shè)計(jì)  回復(fù)  更多評(píng)論   

            # re: C++類庫(kù)設(shè)計(jì)的基本思想和方法 2012-10-02 15:54 SEO Agency

            我們只能有選擇地支持一部分環(huán)境。我們?cè)陂_(kāi)篇就已經(jīng)說(shuō)明,我們選擇g++和Visual C++編譯器  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            <2007年12月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(4)

            隨筆檔案

            網(wǎng)站收藏

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久99热国产这有精品| 亚洲狠狠综合久久| 久久精品人妻一区二区三区| 国产免费久久精品99久久| 久久精品国产精品亚洲下载 | 青青热久久综合网伊人| 精品乱码久久久久久夜夜嗨| 三级三级久久三级久久| a级成人毛片久久| 午夜福利91久久福利| 国产精品一久久香蕉产线看| 久久亚洲精品无码AV红樱桃| 久久影院午夜理论片无码 | 99久久国产综合精品女同图片| 99精品国产在热久久无毒不卡 | 日本强好片久久久久久AAA| 午夜欧美精品久久久久久久| 久久91精品综合国产首页| 国内精品久久久久久久久| 亚洲一区精品伊人久久伊人| 久久96国产精品久久久| 成人a毛片久久免费播放| 欧美久久亚洲精品| 99精品久久久久久久婷婷| 久久精品国产99久久无毒不卡| 久久精品综合网| 久久成人精品| 无码久久精品国产亚洲Av影片| 久久精品9988| 伊人久久大香线蕉综合5g| 久久亚洲精品人成综合网| 激情久久久久久久久久| 久久亚洲日韩精品一区二区三区| 久久综合久久综合九色| 伊人久久大香线蕉无码麻豆| 久久美女人爽女人爽| 99精品国产免费久久久久久下载| 国产精品久久久久久福利漫画| 性做久久久久久免费观看| 欧美久久精品一级c片片| 99久久99久久精品国产片果冻|