內聯函數以及兩種傳值方式的比較 - lidoublewen的專欄 - 博客頻道 - CSDN.NET
今天去參加UCweb的筆試,呵呵,里面涉及了一些c++的基礎知識,原來自己還有些知識是很模糊的,回來查了一下。。。為下次筆試做好準備。
?一.關于內聯函數: 引入內聯函數的目的是為了解決程序中函數調用的效率問題。
?
函數是一種更高級的抽象。它的引入使得編程者只關心函數的功能和使用方法,而不必關心函數功能的具體實現;函數的引入可以減少程序的目標代碼,實現程序代碼和數據的共享。但是,函數調用也會帶來降低效率的問題,因為調用函數實際上將程序執行順序轉移到函數所存放在內存中某個地址,將函數的程序內容執行完后,再返回到轉去執行該函數前的地方。這種轉移操作要求在轉去前要保護現場并記憶執行的地址,轉回后先要恢復現場,并按原來保存地址繼續執行。因此,函數調用要有一定的時間和空間方面的開銷,于是將影響其效率。特別是對于一些函數體代碼不是很大,但又頻繁地被調用的函數來講,解決其效率問題更為重要。引入內聯函數實際上就是為了解決這一問題。
?
在程序編譯時,編譯器將程序中出現的內聯函數的調用表達式用內聯函數的函數體來進行替換。顯然,這種做法不會產生轉去轉回的問題,但是由于在編譯時將函數休中的代碼被替代到程序中,因此會增加目標程序代碼量,進而增加空間開銷,而在時間代銷上不象函數調用時那么大,可見它是以目標代碼的增加為代價來換取時間的節省。
內聯函數的定義方法
定義內聯函數的方法很簡單,只要在函數定義的頭前加上關鍵字inline即可。內聯函數的定義方法與一般函數一樣。如: inline int add_int (int x, int y, int z) { return x+y+z; }
?
在程序中,調用其函數時,該函數在編譯時被替代,而不是像一般函數那樣是在運行時被調用。
使用內聯函數應注意的事項
內聯函數具有一般函數的特性,它與一般函數所不同之處公在于函數調用的處理。一般函數進行調用時,要將程序執行權轉到被調用函數中,然后再返回到調用它的函數中;而內聯函數在調用時,是將調用表達式用內聯函數體來替換。
在使用內聯函數時,應注意如下幾點:
1.類內定義的函數是內聯函數,類外定義的函數是非內聯函數(短函數可以定義在類內,長函數可以定義在類外)。
2.可以為類外定義的函數指定 inline 關鍵字,強行為內聯函數。
3.在內聯函數內不允許用循環語句和開關語句。
4.內聯函數的定義必須出現在內聯函數第一次被調用之前。
?
二.引用傳遞與指針傳遞的比較 a.比較一 引用是C++中的概念,初學者容易把引用和指針混淆一起。 一下程序中,n是m的一個引用(reference),m是被引用物(referent)。 int m; int &n = m; n相當于m的別名(綽號),對n的任何操作就是對m的操作。 所以n既不是m的拷貝,也不是指向m的指針,其實n就是m它自己。 引用的規則:
(1)引用被創建的同時必須被初始化(指針則可以在任何時候被初始化)。
(2)不能有NULL引用,引用必須與合法的存儲單元關聯(指針則可以是NULL)。
?(3)一旦引用被初始化,就不能改變引用的關系(指針則可以隨時改變所指的對象)。
以下示例程序中,k被初始化為i的引用。 語句k = j并不能將k修改成為j的引用,只是把k的值改變成為6。 由于k是i的引用,所以i的值也變成了6。 int i = 5; int j = 6; int &k = i; k = j; // k和i的值都變成了6; 引用的主要功能是傳遞函數的參數和返回值。 C++語言中,函數的參數和返回值的傳遞方式有三種:值傳遞、指針傳遞和引用傳遞。
?
以下是"值傳遞"的示例程序。 由于Func1函數體內的x是外部變量n的一份拷貝,改變x的值不會影響n, 所以n的值仍然是0。 void Func1(int x) { x = x + 10; } ... int n = 0; Func1(n); cout << "n = " << n << endl; // n = 0 以下是"指針傳遞"的示例程序。 由于Func2函數體內的x是指向外部變量n的指針,改變該指針的內容將導致n的值改變,所以n的值成為10。
void Func2(int *x) { (* x) = (* x) + 10; } ... int n = 0; Func2(&n); cout << "n = " << n << endl; // n = 10
?
以下是"引用傳遞"的示例程序。
由于Func3函數體內的x是外部變量n的引用,x和n是同一個東西,改變x等于改變n,所以n的值成為10。
void Func3(int &x) { x = x + 10; } ... int n = 0; Func3(n); cout << "n = " << n << endl; // n = 10
?
對比上述三個示例程序,會發現"引用傳遞"的性質象"指針傳遞",而書寫方式象"值傳遞"。 實際上"引用"可以做的任何事情"指針"也都能夠做,為什么還要"引用"這東西? 答案是"用適當的工具做恰如其分的工作"。 指針能夠毫無約束地操作內存中的任何東西,盡管指針功能強大,但是非常危險。 如果的確只需要借用一下某個對象的"別名",那么就用"引用",而不要用"指針",以免發生意外。 引用就是傳遞的原始變量,指針傳遞的是變量的地址,兩者沒什么關系, 引用主要用于函數參數的傳遞,相對于傳值,可以節省內存空間, 指針可以直接傳遞變量地址,也可以可以節省內存空間,但是指針功能強大一些,可以在自由操作數組變量。
?
b.比較二
(1)非空區別。在任何情況下都不能使用指向空值的引用。一個引用必須總是指向某些對象。因此如果你使用一個變量并讓他指向一個對象,但是該變量在某些時候也可能不指向任何對象,這是你應該把變量聲明為指針,因為這樣你可以賦予空值給該變量。相反,如果變量肯定指向一個對象,例如你的設計不允許變量為空,這時你就可以把變量聲明為引用。不存在指向空值得引用這個事實意味著使用引用的代碼效率比使用指針要高。
(2)合法性區別。在使用引用之前不需要測試它的合法性。相反,指針則應該總是被測試,防止其為空。
(3)可修改區別。指針與引用的另一個重要的不同是指針可以被重新賦值以指向另一個不同的對象。但是引用則是總是指向在初始化時被指定的對象,以后不能改變,但是指定的對象其內容可以改變。
(4)應用區別。總的來說,在以下情況下你應該使用指針:一是你考慮到存在不指向任何對象對象的可能(在這種情況下,你能夠設置指針為空),二是你需要能夠在不同的時刻指向不同的對象(在這種情況下,你能改變指針的指向)。如果總是指向一個對象并且一旦指向一個對象后就不會改變指向,那么你應該使用引用。 三.char* a=0? 原來以為這個是非法的賦值,查了下百度,原來char* a = 0就是char* a = NULL的意思~~
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
