為啥用內聯函數(inline functions)
在C++中函數調用需要建立棧環境,進行參數復制,保護調用現場,返回時進行返回值復制,恢復調用現場.這些操作都需要額外開銷.那有啥好辦法避免頻繁的函數調用呢,
首先想到的可能是把函數中的代碼直接拿來用,而不用先在某處弄個函數,然後再去調用,當然也只是函數比較簡單時可行.但如果多處用到那函數的話,你全部替換會使得代碼冗余,可讀性下降,於是你想到了用宏,一些簡單的函數基本上是些表達式的組合,你用個宏把它全部替換掉.這樣用起來代碼量會少點,可讀性也強點.不過宏只是簡單的替換,不會做多余的檢查,比如檢查函數函數是否匹配啊.這時內聯函數就派上用場了.內聯函數是結合了宏和函數的優點.一方面它在會把函數用函數體中的內容替換掉,這就不需要調用函數的額外開銷,這像宏.另一方面它是在編譯階段而不是預編譯階段,這樣編譯器能做一些安全檢查,比如參數類型檢查啊.
內聯函數用法
內聯函數用法很簡單,在調用函數之前先聲明那函數為內聯函數即可.舉個簡單例子
inline void Print(); //聲明內聯函數,當然你也可以把聲明和定義放到一起,就不用在其他地方再去定義了
int main()
{
Print();
}
inline void Print() //inline關鍵字也可去掉
{
cout<<"this is inline function.;
}
另外據說如果函數中有while,switch等復雜控件結構,或者有遞歸調用.內聯函數會自動失效.會當成一般函數去調用了.不過這玩藝也不太好驗證.不知道啥時確實去內聯了,啥時是只當一般函數處理了.
匿名函數
C#中沒有內聯函數的概念,不過有個比較類似的概念,叫匿名函數.
舉個簡單例子
delegate void MyDelegate(string name);
class Program
{
static void Print(string name)
{
Console.WriteLine("hello," + name);
}
static void Main(string[] args)
{
MyDelegate arwen = Print;
arwen("arwen");
}
}
這裡用到了代理,類似於一個函數指針.當定義一個代理時要指定一個函數,我們還得另外在某個地方定義一個函數.如果函數比較簡單的話我們可以不用在其他地方定義,直接就地展開,用一個匿名函數就OK.例如
MyDelegate weiwen = delegate(string name) { Console.WriteLine("hi," + name); }; //這就是匿名函數
weiwen("weiwen");
在C# 3.0中出現了拉姆達(lambda)表達式,可以把匿名方法進一步簡化
MyDelegate weiwenhp = (xxx) => { Console.WriteLine("hi," + xxx);};
weiwenhp("weiwenhp");
這看著更爽吧.函數的參數可以給你推斷出來,所以參數你隨便用個啥東東表示下,用xxx或者yyy這些亂七八糟的都可以.
拉姆達表達式是從Lisp, Scheme等函數式編程語言裡借鑒過來的東東.在C#裡主要應用在Linq中.