c++內聯函數


內聯函數和宏的功能很相似,在介紹內聯函數前先介紹一下宏。如下:

#define TABLE_COMP(x) ((x)>0?(x):0)

這就定義了一個宏。爲什麼要定義宏呢?在程序執行時,程序是按照順序執行的,當執行到某個函數調用時,程序必須從現在所執行的地方跳轉到函數的入口地址,在跳轉前要保存現在的執行現場,等函數執行完後,返回時需要恢復跳轉前的執行現場,在一定的程度上會增加程序時間和空間的開銷。而宏只是在預處理的時候,把宏定義的地方用定義的代碼代替,不需要額外的空間和時間方面的開銷,所以調用一個宏比調用一個函數更有效率。
但是宏也有很多的不盡人意的地方。
1、宏不能訪問類的私有成員
2、容易產生二義性

#define TABLE_MULTI(x) (x*x)

當傳進去的是10+10,即TABLE_MUTI(10+10),那麼結果就是 10+10*10+10爲120,而不是期望的400,使用括號可以解決這一問題

#define TABLE_MULTI(x) ((x)*(x))

但是加括號也有些難以避免的問題 ,如int a = 5; 傳入a++時,我們期望得到的是 5 * 5 = 25; 但是實際的運行結果是 5 * 6 = 30;事實上,在一些C的庫函數中也有這些問題。
有人說 Toupper(*pChar++)就會對pChar執行兩次++操作,因爲Toupper實際上也是一個宏。 經過本人實驗代碼如下:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
    char *s = "Hello, World!";
    printf( "%s \n", s);
    while(*s != '\0')
    {
    putchar(toupper(*s++));
    }
    getchar();
   return 0;
}

輸出結果:
Hello, World!
HELLO, WORLD!

內聯函數VS宏
內聯函數和宏的區別在於,宏是由預處理器對宏進行替代,而內聯函數是通過編譯器控制來實現的。而且內聯函數是真正的函數,只是在需要用到的時候,內聯函數像宏一樣的展開,所以取消了函數的參數壓棧,減少了調用的開銷。你可以象調用函數一樣來調用內聯函數,而不必擔心會產生於處理宏的一些問題。
我們可以用Inline來定義內聯函數,不過,任何在類的說明部分定義的函數都會被自動的認爲是內聯函數。
下面我們來介紹一下內聯函數的用法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章