最新內(nèi)聯(lián)函數(shù)用法實(shí)用

網(wǎng)絡(luò)整理 分享 時(shí)間: 收藏本文

最新內(nèi)聯(lián)函數(shù)用法實(shí)用

在日常學(xué)習(xí)、工作或生活中,大家總少不了接觸作文或者范文吧,通過(guò)文章可以把我們那些零零散散的思想,聚集在一塊。寫范文的時(shí)候需要注意什么呢?有哪些格式需要注意呢?這里我整理了一些優(yōu)秀的范文,希望對(duì)大家有所幫助,下面我們就來(lái)了解一下吧。

內(nèi)聯(lián)函數(shù)用法篇一

導(dǎo)語(yǔ):對(duì)比于c語(yǔ)言的函數(shù),c++增加了重載、內(nèi)聯(lián)、const和virtual四種新機(jī)制。下面就由小編為大家介紹一下c++中內(nèi)聯(lián)函數(shù)的應(yīng)用,歡迎大家閱讀!

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

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

讓我們看看c++的“函數(shù)內(nèi)聯(lián)”是如何工作的。對(duì)于任何內(nèi)聯(lián)函數(shù),編譯器在符號(hào)表里放入函數(shù)的聲明。如果編譯器沒(méi)有發(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)用的開(kāi)銷。這個(gè)過(guò)程與預(yù)處理有顯著的不同,因?yàn)轭A(yù)處理器不能進(jìn)行類型安全檢查,或者進(jìn)行自動(dòng)類型轉(zhuǎn)換。假如內(nèi)聯(lián)函數(shù)是成員函數(shù),對(duì)象的地址會(huì)被放在合適的地方,這也是預(yù)處理器辦不到的。

c++語(yǔ)言的函數(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ù),而是宏。

關(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ù)定義體放在一起

{

}

所以說(shuō),inline是一種“用于實(shí)現(xiàn)的關(guān)鍵字”,而不是一種“用于聲明的關(guān)鍵字”。一般地,用戶可以閱讀函數(shù)的聲明,但是看不到函數(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è)基本原則:聲明與定義不可混為一談,用戶沒(méi)有必要、也不應(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ù)的定義體放在類聲明之中雖然能帶來(lái)書(shū)寫上的方便,但不是一種良好的編程風(fēng)格,上例應(yīng)該改成:

// 頭文件

class a

{

public:

void foo(int x, int y);

}

// 定義文件

inline void a::foo(int x, int y)

{

}

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

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

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

類的構(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)一步說(shuō)明了inline不應(yīng)該出現(xiàn)在函數(shù)的聲明中。

c++語(yǔ)言中的內(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ù)。

s("content_relate");

【c++中內(nèi)聯(lián)函數(shù)的應(yīng)用】相關(guān)文章:

c++調(diào)用c函數(shù)的方法

09-28

c++函數(shù)指針學(xué)習(xí)教程

10-03

c++如何調(diào)用matlab函數(shù)

09-29

c++中可以接受任意多個(gè)參數(shù)的函數(shù)定義方法

10-05

關(guān)于c++中定義比較函數(shù)的三種方法

10-05

c++類的成員變量和成員函數(shù)

09-30

java程序調(diào)用c/c++語(yǔ)言函數(shù)的方法

11-02

c++的字符串分割函數(shù)的使用詳解

10-04

計(jì)算機(jī)二級(jí)c++函數(shù)考點(diǎn)

10-06

信息流廣告 競(jìng)價(jià)托管 招生通 周易 易經(jīng) 代理招生 二手車 網(wǎng)絡(luò)推廣 自學(xué)教程 招生代理 旅游攻略 非物質(zhì)文化遺產(chǎn) 河北信息網(wǎng) 石家莊人才網(wǎng) 買車咨詢 河北人才網(wǎng) 精雕圖 戲曲下載 河北生活網(wǎng) 好書(shū)推薦 工作計(jì)劃 游戲攻略 心理測(cè)試 石家莊網(wǎng)絡(luò)推廣 石家莊招聘 石家莊網(wǎng)絡(luò)營(yíng)銷 培訓(xùn)網(wǎng) 好做題 游戲攻略 考研真題 代理招生 心理咨詢 游戲攻略 興趣愛(ài)好 網(wǎng)絡(luò)知識(shí) 品牌營(yíng)銷 商標(biāo)交易 游戲攻略 短視頻代運(yùn)營(yíng) 張家口人才網(wǎng) 秦皇島人才網(wǎng) PS修圖 寶寶起名 零基礎(chǔ)學(xué)習(xí)電腦 電商設(shè)計(jì) 職業(yè)培訓(xùn) 免費(fèi)發(fā)布信息 服裝服飾 律師咨詢 搜救犬 Chat GPT中文版 語(yǔ)料庫(kù) 范文網(wǎng) 工作總結(jié) 二手車估價(jià) 情侶網(wǎng)名 愛(ài)采購(gòu)代運(yùn)營(yíng) 保定招聘 情感文案 吊車 古詩(shī)詞 邯鄲人才網(wǎng) 鐵皮房 衡水人才網(wǎng) 石家莊點(diǎn)痣 微信運(yùn)營(yíng) 養(yǎng)花 名酒回收 石家莊代理記賬 女士發(fā)型 搜搜作文 石家莊人才網(wǎng) 銅雕 關(guān)鍵詞優(yōu)化 圍棋 chatGPT 讀后感 玄機(jī)派 企業(yè)服務(wù) 法律咨詢 chatGPT國(guó)內(nèi)版 chatGPT官網(wǎng) 勵(lì)志名言 兒童文學(xué) 河北代理記賬公司 狗狗百科 教育培訓(xùn) 游戲推薦 抖音代運(yùn)營(yíng) 朋友圈文案 男士發(fā)型 培訓(xùn)招生 文玩 大可如意 保定人才網(wǎng) 滄州人才網(wǎng) 黃金回收 承德人才網(wǎng) 石家莊人才網(wǎng) 模型機(jī) 高度酒 沐盛有禮 公司注冊(cè) 十畝地 造紙術(shù) 唐山人才網(wǎng) 沐盛傳媒