最新內聯(lián)函數用法實用

            網絡整理 分享 時間: 收藏本文

            最新內聯(lián)函數用法實用

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

            內聯(lián)函數用法篇一

            導語:對比于c語言的函數,c++增加了重載、內聯(lián)、const和virtual四種新機制。下面就由小編為大家介紹一下c++中內聯(lián)函數的應用,歡迎大家閱讀!

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

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

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

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

            關鍵字inline必須與函數定義體放在一起才能使函數成為內聯(lián),僅將inline放在函數聲明前面不起任何作用。如下風格的'函數foo不能成為內聯(lián)函數:

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

            void foo(int x, int y)

            {

            }

            而如下風格的函數foo則成為內聯(lián)函數:void foo(int x, int y);

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

            {

            }

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

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

            class a

            {

            public:

            void foo(int x, int y) { … } // 自動地成為內聯(lián)函數

            }

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

            // 頭文件

            class a

            {

            public:

            void foo(int x, int y);

            }

            // 定義文件

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

            {

            }

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

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

            ⑴如果函數體內的代碼比較長,使用內聯(lián)將導致內存消耗代價較高。

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

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

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

            s("content_relate");

            【c++中內聯(lián)函數的應用】相關文章:

            c++調用c函數的方法

            09-28

            c++函數指針學習教程

            10-03

            c++如何調用matlab函數

            09-29

            c++中可以接受任意多個參數的函數定義方法

            10-05

            關于c++中定義比較函數的三種方法

            10-05

            c++類的成員變量和成員函數

            09-30

            java程序調用c/c++語言函數的方法

            11-02

            c++的字符串分割函數的使用詳解

            10-04

            計算機二級c++函數考點

            10-06

            主站蜘蛛池模板: 国产一区二区三区电影| 精品一区二区三区在线播放视频| 无码一区二区三区亚洲人妻 | 精品亚洲AV无码一区二区| 精品国产一区二区三区久 | 国产福利微拍精品一区二区 | 日韩精品乱码AV一区二区| 国产一区二区精品久久凹凸| 精品日韩在线视频一区二区三区| 四虎精品亚洲一区二区三区| 久久久国产精品无码一区二区三区 | 国产精品美女一区二区三区| 乱子伦一区二区三区| 中文字幕一区在线| 国产午夜福利精品一区二区三区 | 好吊妞视频一区二区| 精品人妻一区二区三区四区| 国产在线精品观看一区| 三级韩国一区久久二区综合 | 国产福利电影一区二区三区久久久久成人精品综合 | 伊人久久精品无码麻豆一区| 国产精品制服丝袜一区| 97一区二区三区四区久久| 3D动漫精品一区二区三区| 毛片一区二区三区| 国产日韩精品一区二区在线观看| 在线观看一区二区精品视频| 国产一区二区精品久久岳√| 国产成人免费一区二区三区| 国产激情一区二区三区| 久久99精品国产一区二区三区| 日韩免费视频一区二区| 国产精品一区二区综合| 污污内射在线观看一区二区少妇| ...91久久精品一区二区三区| 国模大胆一区二区三区| 国产色精品vr一区区三区| 亚洲国产视频一区| 国产成人精品一区二三区在线观看| 97人妻无码一区二区精品免费| 一区二区三区电影网|