首先,說說三個名詞的基本概念:
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,內聯中不能自己遞歸自己),因爲多出的編譯成本遠大於函數調用成本的減少量。短代碼適合內聯!