優化程式之 巨集與內聯函式

2021-06-19 00:28:41 字數 810 閱讀 4010

內聯函式從

源**層看,有函式的結構,而在編譯後,卻不具備函式的性質。內聯函式不是在呼叫時發生控制轉移,而是在編譯時將函式體嵌入在每乙個呼叫處。編譯時,類似巨集替換,使用

函式體替換呼叫處的函式名。一般在**中用inline修飾,但是能否形成內聯函式,需要看

編譯器對該函式定義的具體處理。帶有引數的巨集定義中不含有型別名稱,多行語句一般使用do while語句,例如:

3 #define  addtohere(mynode,parentnode,child)\

4 dowhile(0)

1).遞迴函式不能定義為內聯函式

2).內聯函式一般適合於不存在while和switch等複雜的結構且只有1~5條語句的小函式上,否則編譯系統將該函式視為普通函式。

3).內聯函式只能先定義後使用,否則編譯系統也會把它認為是普通函式。

1).巨集不能訪問物件的私有成員。

2).巨集的定義很容易產生二義性。

2.2巨集定義的常見二義性

1)沒有給引數加括號從而導致的優先順序混亂

2)在傳遞引數的時候使用了表示式,表示式中含有++運算,從而導致的引數失真

內聯函式和巨集的區別在於,巨集是由

預處理器

對巨集進行替代,而內聯函式是

通過編譯器

控制來實現的。而且內聯函式是真正的函式,只是在需要用到的時

候,內聯函式像巨集一樣的展開,所以取消了函式的引數壓棧,減少了呼叫的開

銷。你可以象呼叫函式一樣來呼叫內聯函式,而不必擔心會產生於處理巨集的一

些問題。

巨集與內聯函式

函式作為一種抽象機制,對解決大型複雜問題起到了很大作用。但是,由於函式呼叫時需要開銷的,例如,函式呼叫時需要保護呼叫者的執行環境,進行引數傳遞,執行呼叫命令,為區域性變數分配空間以及執行返回指令等,因此函式會帶來程式執行效率的下降,特別是對一些小函式的頻繁呼叫。c 提供了兩種解決上述問題的辦法 巨集...

巨集與內聯函式

建議 1 使用const定義常量而不是 define 2 使用inline內聯函式而不是 define來定義小型函式 第一部分 巨集 為什麼要使用巨集呢?因為函式的呼叫 必須要將程式執行的順序轉移到函式所存放在記憶體中的某個位址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。這種轉移操作...

巨集與內聯函式

第一部分 巨集 為什麼要使用巨集呢?因為函式的呼叫必須要將程式執行的順序轉移到函式所存放在記憶體中的某個位址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。這種轉移操作要求在轉去執行前要儲存現場並記憶執行的位址,轉回後要恢復現場,並按原來儲存位址繼續執行。因此,函式呼叫要有一定的時間和空...