宏定義(#define)、內聯函數、typedef的區別

首先,說說三個名詞的基本概念:
1、宏定義:一種簡單的發生在編譯之前的文本插入替換
語法: #define p_char char*
注意!不需要分號標識結束

2、typedef:發生在編譯期間,用於定義類型別名
語法:typedef char* p_char;
注意!需要分號標識結束

typedef可以用於各種數據結構的別名定義,但是宏定義比起typedef更容易引起危險。詳見以下示例:

#include<iostream>
#define a_char char* 
typedef char* b_char;
int main()
{
	a_char p1,p2;  //p1是個char指針,p2是個char變量
	b_char p3,p4; //p3,p4都是char指針
	return 0;
}

3、內聯函數(inline)發生在編譯期間
用法:inline用在定義函數時使用

inline  ret_val A
{
	...
	return ...;
}

以上代碼發生在程序員想告訴編譯器:我定義了返回值爲ret_val的函數A!調用函數的時候不要調用它!而是插入函數體的返回值!
具體例子如下(代碼轉載自https://blog.csdn.net/cpongo3/article/details/93996094):

inline char* dbtest(int a) 
{  
    return (i % 2 > 0) ? "奇" : "偶";  
}   
 
int main()  
{  
    int i = 0;  
    for (i=1; i < 100; i++) 
    {  
        printf("i:%d    奇偶性:%s /n", i, dbtest(i));      
    }  
}

上面的例子就是標準的內聯函數的用法,使用inline修飾帶來的好處我們表面看不出來,其實在內部的工作就是在每個for循環的內部任何調用dbtest(i)的地方都換成了(i%2>0)?“奇”:"偶"這樣就避免了頻繁調用函數對棧內存重複開闢所帶來的消耗。

內聯函數與define都執行了替換,那麼性能如何變化呢?
內聯函數減少了函數調用,但是增加了代碼編譯量。
顯然,很長的代碼不適合內聯(PS,內聯中不能自己遞歸自己),因爲多出的編譯成本遠大於函數調用成本的減少量。短代碼適合內聯!

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