函數調用的開銷:
函數被調用時,要有函數調用和返回。要保存當前程序上下文信息,以便函數調用完畢後返回原來的地方,繼續執行程序。將函數的參數進行壓棧、出棧,執行函數,函數調用完畢後釋放內部變量占用的內存。
inline作用:
將函數聲明為inline,是對編譯器的一種建議,編譯器可以選擇不進行inline。大多數編譯器是在編譯過程中進行inline。所以不能對virtual函數進行inline,因為編譯的時候編譯器不知道該調用哪個函數。編譯器也不對通過函數指針進行的調用實施inlining.
不要輕易的對構造函數和析構函數進行inline,因為即使看著函數體是空的,其實內部編譯器會產生一些代碼,比如添加默認構造函數,默認拷貝構造函數等等。
將函數聲明為inline,編譯器不把它當做是一個函數,而是類似於把函數代碼拷貝到原來的地方,這樣就省下了函數調用的開銷。
將大多數inlining限制在小型、被頻繁調用的函數上。內聯函數會在每一處調用函數的地方進行代碼復制,會使產生的代碼膨脹,對於函數很大來說,這樣獲得的速度提高會很小甚至沒有。所以對於遞歸,循環等不進行inline。
inline函數要將聲明和定義放在一塊,不然沒有效果。在類內部的函數定義會自動擴展成inline。在類外部則需顯式加上inline聲明。
通常要將inline函數放在頭文件內。
大部分調試器對inline函數束手無策,因為在一個不存在的函數內設立斷點並不容易。