C 與C 對比學習 內聯函式,匿名函式

2021-09-30 15:38:06 字數 1445 閱讀 3254

在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) ; //這就是匿名函式

weiwen("weiwen");

在c# 3.0**現了拉姆達(lambda)表示式,可以把匿名方法進一步簡化

mydelegate weiwenhp = (***) => ;

weiwenhp("weiwenhp");

這看著更爽吧.函式的引數可以給你推斷出來,所以引數你隨便用個啥東東表示下,用***或者yyy這些亂七八糟的都可以.

拉姆達表示式是從lisp, scheme等函式式程式語言裡借鑑過來的東東.在c#裡主要應用在linq中.

C 學習 內聯函式

巨集 可以做兩件事情 1 定義常量 2 定義函式 define a 10 define add x,y x y c 建議用 1 const 替換巨集常量 2 用 內聯函式 替換巨集函式 內聯函式定義 在函式定義前加 inline 關鍵字 注意 在宣告前加無效 巨集函式是在預處理期間進行處理 內聯函式...

c 學習三 C 內聯函式

使用函式能夠避免將相同 重寫多次的麻煩,還能減少可執行程式的體積,但也會帶來程式執行時間上的開銷。函式呼叫在執行時,首先要在棧中為形參和區域性變數分配儲存空間,然後還要將實參的值複製給形參,接下來還要將函式的返回位址 該位址指明了函式執行結束後,程式應該回到 繼續執行 放入棧中,最後才跳轉到函式內部...

C 巨集與內聯函式

因為函式呼叫需要開銷 如 保護呼叫者的執行環境 引數傳遞 執行呼叫指令等 所以函式呼叫會帶來程式執行效率的下降,特別是對一些小函式的頻繁呼叫將是程式的效率有很大的降低。c 提出了兩種解決方法 巨集 內聯函式。1.巨集 巨集是c 編譯預處理系統處理的實體。巨集定義的4種格式 1 define 巨集名 ...