亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        淺談C++中內(nèi)聯(lián)函數(shù)的應(yīng)用

        2013-12-31 00:00:00許建宏汪婧
        無線互聯(lián)科技 2013年11期

        摘 要:本文著重探究內(nèi)聯(lián)的優(yōu)點(diǎn)與局限性,說明什么情況下應(yīng)該采用、不該采用以及要警惕錯(cuò)用。

        關(guān)鍵詞:C語言;C++;內(nèi)聯(lián)函數(shù)

        對(duì)比于C語言的函數(shù),C++增加了重載、內(nèi)聯(lián)、const和virtual四種新機(jī)制。其中重載和內(nèi)聯(lián)機(jī)制既可用于全局函數(shù)也可用于類的成員函數(shù),const與virtual機(jī)制僅用于類的成員函數(shù)。重載和內(nèi)聯(lián)肯定有其好處才會(huì)被C++語言采納,但是不可以當(dāng)成免費(fèi)的午餐而濫用。

        1 用內(nèi)聯(lián)取代宏代碼

        C++語言支持函數(shù)內(nèi)聯(lián),其目的是為了提高函數(shù)的執(zhí)行效率。在C程序中,可以用宏代碼提高執(zhí)行效率。宏代碼本身不是函數(shù),但使用起來象函數(shù)。預(yù)處理器用復(fù)制宏代碼的方式代替函數(shù)調(diào)用,省去了參數(shù)壓棧、生成匯編語言的CALL調(diào)用、返回參數(shù)、執(zhí)行return等過程,從而提高了速度。使用宏代碼最大的缺點(diǎn)是容易出錯(cuò),預(yù)處理器在復(fù)制宏代碼時(shí)常常產(chǎn)生意想不到的邊際效應(yīng)。

        例如“#define MAX(a,b) (a)>(b)?(a):(b)”語句“result=MAX(i,j)+2;”將被預(yù)處理器解釋為“result=(i)>(j)?(i):(j)+2;”由于運(yùn)算符‘+’比運(yùn)算符‘:’的優(yōu)先級(jí)高,所以上述語句并不等價(jià)于期望的“result=((i)>(j)? (i):(j))+2;”。如果把宏代碼改寫為“#define MAX(a,b)((a)>(b)?(a):(b))”,則可以解決由優(yōu)先級(jí)引起的錯(cuò)誤。但是即使使用修改后的宏代碼也不是萬無一失的,例如語句“result=MAX(i++,j);”將被預(yù)處理器解釋為“result=(i++)>(j)?(i++):(j);”。對(duì)于C++ 而言,使用宏代碼還有另一種缺點(diǎn),即無法操作類的私有數(shù)據(jù)成員。

        讓我們看看C++的“函數(shù)內(nèi)聯(lián)”是如何工作的。對(duì)于任何內(nèi)聯(lián)函數(shù),編譯器在符號(hào)表里放入函數(shù)的聲明。如果編譯器沒有發(fā)現(xiàn)內(nèi)聯(lián)函數(shù)存在錯(cuò)誤,那么該函數(shù)的代碼也被放入符號(hào)表里。在調(diào)用一個(gè)內(nèi)聯(lián)函數(shù)時(shí),編譯器首先檢查調(diào)用是否正確。如果正確,內(nèi)聯(lián)函數(shù)的代碼就會(huì)直接替換函數(shù)調(diào)用,于是省去了函數(shù)調(diào)用的開銷。這個(gè)過程與預(yù)處理有顯著的不同,因?yàn)轭A(yù)處理器不能進(jìn)行類型安全檢查,或者進(jìn)行自動(dòng)類型轉(zhuǎn)換。假如內(nèi)聯(lián)函數(shù)是成員函數(shù),對(duì)象的地址會(huì)被放在合適的地方,這也是預(yù)處理器辦不到的。

        C++語言的函數(shù)內(nèi)聯(lián)機(jī)制既具備宏代碼的效率,又增加了安全性,而且可以自由操作類的數(shù)據(jù)成員。所以在C++程序中,應(yīng)該用內(nèi)聯(lián)函數(shù)取代所有宏代碼,“斷言assert”恐怕是唯一的例外。assert是僅在Debug版本起作用的宏,它用于檢查“不應(yīng)該”發(fā)生的情況。為了不在程序的Debug版本和Release版本引起差別,assert不應(yīng)該產(chǎn)生任何副作用。如果assert是函數(shù),由于函數(shù)調(diào)用會(huì)引起內(nèi)存、代碼的變動(dòng),那么將導(dǎo)致Debug版本與Release版本存在差異。所以assert不是函數(shù),而是宏。

        2 內(nèi)聯(lián)函數(shù)的編程風(fēng)格

        關(guān)鍵字inline必須與函數(shù)定義體放在一起才能使函數(shù)成為內(nèi)聯(lián),僅將inline放在函數(shù)聲明前面不起任何作用。如下風(fēng)格的函數(shù)Foo不能成為內(nèi)聯(lián)函數(shù):

        inline void Foo(int x, int y); // inline僅與函數(shù)聲明放在一起

        void Foo(int x, int y)

        {

        }

        而如下風(fēng)格的函數(shù)Foo則成為內(nèi)聯(lián)函數(shù):void Foo(int x, int y);

        inline void Foo(int x, int y)// inline與函數(shù)定義體放在一起

        {

        }

        所以說,inline是一種“用于實(shí)現(xiàn)的關(guān)鍵字”,而不是一種“用于聲明的關(guān)鍵字”。一般地,用戶可以閱讀函數(shù)的聲明,但是看不到函數(shù)的定義。盡管在大多數(shù)教科書中內(nèi)聯(lián)函數(shù)的聲明、定義體前面都加了inline關(guān)鍵字,但我認(rèn)為inline不應(yīng)該出現(xiàn)在函數(shù)的聲明中。這個(gè)細(xì)節(jié)雖然不會(huì)影響函數(shù)的功能,但是體現(xiàn)了高質(zhì)量C++/C程序設(shè)計(jì)風(fēng)格的一個(gè)基本原則:聲明與定義不可混為一談,用戶沒有必要、也不應(yīng)該知道函數(shù)是否需要內(nèi)聯(lián)。

        定義在類聲明之中的成員函數(shù)將自動(dòng)地成為內(nèi)聯(lián)函數(shù),例如

        class A

        {

        public:

        void Foo(int x, int y) { … } // 自動(dòng)地成為內(nèi)聯(lián)函數(shù)

        }

        將成員函數(shù)的定義體放在類聲明之中雖然能帶來書寫上的方便,但不是一種良好的編程風(fēng)格,上例應(yīng)該改成:

        // 頭文件

        class A

        {

        public:

        void Foo(int x, int y);

        }

        // 定義文件

        inline void A::Foo(int x, int y)

        {

        }

        3 慎用內(nèi)聯(lián)

        內(nèi)聯(lián)能提高函數(shù)的執(zhí)行效率,為什么不把所有的函數(shù)都定義成內(nèi)聯(lián)函數(shù)?但如果所有的函數(shù)都是內(nèi)聯(lián)函數(shù),還用得著“內(nèi)聯(lián)”這個(gè)關(guān)鍵字嗎?

        內(nèi)聯(lián)是以代碼膨脹(復(fù)制)為代價(jià),僅僅省去了函數(shù)調(diào)用的開銷,從而提高函數(shù)的執(zhí)行效率。如果執(zhí)行函數(shù)體內(nèi)代碼的時(shí)間,相比于函數(shù)調(diào)用的開銷較大,那么效率的收獲會(huì)很少。另一方面,每一處內(nèi)聯(lián)函數(shù)的調(diào)用都要復(fù)制代碼,將使程序的總代碼量增大,消耗更多的內(nèi)存空間。以下情況不宜使用內(nèi)聯(lián):

        ⑴如果函數(shù)體內(nèi)的代碼比較長,使用內(nèi)聯(lián)將導(dǎo)致內(nèi)存消耗代價(jià)較高。

        ⑵如果函數(shù)體內(nèi)出現(xiàn)循環(huán),那么執(zhí)行函數(shù)體內(nèi)代碼的時(shí)間要比函數(shù)調(diào)用的開銷大。

        類的構(gòu)造函數(shù)和析構(gòu)函數(shù)容易讓人誤解成使用內(nèi)聯(lián)更有效。要當(dāng)心構(gòu)造函數(shù)和析構(gòu)函數(shù)可能會(huì)隱藏一些行為,如“偷偷地”執(zhí)行了基類或成員對(duì)象的構(gòu)造函數(shù)和析構(gòu)函數(shù)。所以不要隨便地將構(gòu)造函數(shù)和析構(gòu)函數(shù)的定義體放在類聲明中。一個(gè)好的編譯器將會(huì)根據(jù)函數(shù)的定義體,自動(dòng)地取消不值得的內(nèi)聯(lián),這也進(jìn)一步說明了inline不應(yīng)該出現(xiàn)在函數(shù)的聲明中。

        C++語言中的內(nèi)聯(lián)展現(xiàn)了很多優(yōu)點(diǎn),但是這些優(yōu)點(diǎn)的背后都隱藏著一些隱患。正如人們的飲食,少食和暴食都不可取,應(yīng)當(dāng)恰到好處。我們要辨證地看待C++的一些新機(jī)制,應(yīng)該恰如其分地使用它們。雖然這會(huì)使我們編程時(shí)多費(fèi)一些心思,少了一些痛快,但這才是編程的藝術(shù)。

        中国极品少妇videossexhd| 中文字幕在线乱码日本| 中文字幕有码在线人妻| 国产91色综合久久高清| 少妇被又大又粗又爽毛片久久黑人| 国产老熟女网站| 正在播放国产对白孕妇作爱| 亚洲小说图区综合在线| 91极品尤物在线观看播放| 亚洲高清av一区二区 | 国产黄色av一区二区三区| 综合色就爱涩涩涩综合婷婷| 国精品无码一区二区三区在线蜜臀| 亚洲另类精品无码专区 | 按摩女内射少妇一二三区| 日韩一级精品视频免费在线看| 精品一区二区三区芒果| 色www永久免费视频| 国产成人精品999在线观看| 9191在线亚洲精品| av免费看网站在线观看| 中国亚洲av第一精品| 日韩乱码人妻无码系列中文字幕| 97日日碰曰曰摸日日澡| a级毛片免费完整视频| 国产精品亚洲成在人线| 一区二区韩国福利网站| 肉丝高跟国产精品啪啪| 护士人妻hd中文字幕| 日本一区二区三区爆乳| 日日摸天天摸人人看| 亚洲美腿丝袜综合一区| 深夜福利国产| 中文字幕一区二区三区日日骚| 野花香社区在线视频观看播放| 国产午夜精品一区二区三区嫩草| 国产做无码视频在线观看浪潮| 成人无码无遮挡很H在线播放| 熟女人妻一区二区中文字幕| 中文字幕在线看精品乱码| 亚洲av无码精品国产成人|