C++ 普通行內函數 及行內函數與巨集的區別
巨集的使用:
因為函式的呼叫必須要將程式執行的順序轉移到函式所存放在記憶體中的某個地址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。這種轉移操作要求在轉去執行前要儲存現場並記憶執行的地址,轉回後要恢復現場,並按原來儲存地址繼續執行。因此,函式呼叫要有一定的時間和空間方面的開銷,於是將影響其效率。而巨集只是在預處理的地方把程式碼展開,不需要額外的空間和時間方面的開銷,所以呼叫一個巨集比呼叫一個函式更有效率。
但是巨集也有很多的不盡人意的地方。1、巨集不能訪問物件的私有成員。
2、巨集的定義很容易產生二意性。
行內函數:
行內函數和巨集的區別在於,巨集是由前處理器對巨集進行替代,而行內函數是通過編譯器控制來實現的。而且行內函數是真正的函式,只是在需要用到的時候,行內函數像巨集一樣的展開,所以取消了函式的引數壓棧,減少了呼叫的開銷。你可以象呼叫函式一樣來呼叫行內函數,而不必擔心會產生於處理巨集的一些問題。
我們可以用Inline來定義行內函數,不過,任何在類的說明部分定義的函式都會被自動的認為是行內函數。
行內函數的注意點:
1,行內函數使用inline開宣告函式,宣告之後編譯器不會真正的建立函式,而只是將這個行內函數的所有程式碼複製到呼叫函式中,這樣不會
跳轉了,自然提高了程式的執行時的效率,但是複製程式碼會增大程式的體積。
2,行內函數的函式體過大,一般的編譯器會放棄內聯方式,而採用普通的方式呼叫函式。
在C++中,在類的內部定義了函式體的函式,被預設為是行內函數。而不管你是否有inline關鍵字。
//
// inline.cpp
// C++primary
//
// Created by amesty on 16/5/11.
// Copyright © 2016年 travelrely. All rights reserved.
//
#include <stdio.h>
#include <iostream>
usingnamespace std;
inlineint func(int); //使用inline將帶有一個int變數並返回int值的函式func說明為行內函數
int main()
{
int x;
cout<<"請輸入一個數字\n";
cin>>x; //將使用者輸入的數字儲存在x變數中
cout<<"\n"
cout<<"輸入的數字為:"<<func(x)<<endl; //將該變數作為引數傳遞到函式func(x)中。由於該函式是個行內函數,它的所有程式碼都被直接複製在該行的func(x)處,因此這裡不會跳轉到第12行去執行func函式體中的語句
return 0;
}
int func(int x)//函式定義頭
{ //函式體
return x; //該行程式碼會被直接複製到第10行的func(x)處
}