1. 程式人生 > >行內函數和巨集定義的區別和聯絡

行內函數和巨集定義的區別和聯絡

  深入到計算機的本質,其實,很多東西還是細節需要深入分析的,比如我最近的一份工作

  行內函數和巨集很類似,都是以空間換時間,都能一定程度上加快程式的執行。而區別在於,巨集是由前處理器對巨集進行替代,而行內函數是通過編譯器控制來實現的。而且行內函數是真正的函式,只是在需要用到的時候,行內函數像巨集一樣的展開,所以取消了函式的引數壓棧,減少了呼叫的開銷。你可以象呼叫函式一樣來呼叫行內函數,而不必擔心會產生於處理巨集的一些問題。當然,行內函數也有一定的侷限性。就是函式中的執行程式碼不能太多了,如果,行內函數的函式體過大,一般的編譯器會放棄內聯方式,而採用普通的方式呼叫函式。這樣,行內函數就和普通函式執行效率一樣了。

簡而言之,兩者的區別如下:

1.巨集定義是在預處理階段由前處理器替換,行內函數是在編譯時編譯器執行。

2.行內函數還是有函式的特性,而巨集定義真的只是簡單的字串替換,容易出現一些問題。

 下面給出一份測試他們速度的程式碼:

#include <stdio.h>
#include <time.h>

#define NUM(x) x*x*x

static inline int num_test(int x)
{
    return x*x*x;
}

static int array[32];
int main()
{
    
int test = 0xEFFFFFFF; int cnt = 0; long long num = 0,num1 = 0; clock_t start, finish; double duration; start = clock(); while(cnt++ < 10000) { num += NUM(cnt); } finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; printf(
"%f seconds \n\t", 1000*duration ); cnt = 0; start = 0, finish = 0; start = clock(); while(cnt++ < 10000) { num1 += num_test(cnt); } finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; printf( "%f ms seconds \n\t", 1000*duration ); printf("num:%d num1:%d \n\t",num, num1); return 0; }

  具體的運算時間就需要你自己執行一下了,筆者只是知道,這個速度是幾乎沒什麼差別的,就看你怎麼用了,什麼具體的場景使用什麼了。