内联函数和宏定义
1.內聯函數和宏定義的區別
內聯函數和普通函數相比可以加快程序的運行速度,在編譯的時候內聯函數可以直接鑲嵌到目標代碼中,而宏只是一個不加任何檢查的簡單的替換。內聯函數要做參數類型檢查。宏不是函數,只是在編譯預處理階段將程序中的有關字符串替換成宏體。
inline是嵌入代碼,在調用函數的地方直接把代碼寫到這個地方,而不用中斷調用。對于短小的代碼來說,inline增加空間消耗,換時間效率,也就是我們常說的空間換時間。但是inline需要根據具體情況來選擇是否需要使用。
2.內聯函數的使用情況
內聯函數一般用于以下情況:
(1)一個函數不斷被重復調用
(2)函數只有簡單的幾行代碼,且不應該包含for,while,switch這些語句
一般小程序不需要使用內聯函數,如果完成一個大的工程項目,且一個簡單的函數被調用多次,那么可以考慮使用。
關鍵字inline必須與函數定義放在一起才能使函數成為內聯函數,比如
如上面這種情況就起不到作用。
再比如
上面這種情況才會起到作用。
在書籍中有提出,宏是用于"實現的關鍵字"而不是用于“聲明的關鍵字”。
3.內聯函數不宜使用的情況
那么不禁提出問題,既然內聯函數可以提高效率,為什么不都使用內聯函數呢?
原因是內聯是以代碼膨脹(復制)為代價,省去函數調用的開銷,從而提高函數的執行效率。如果執行函數體內的代碼的時間遠遠比函數調用開銷大,那么使用內斂函數效益會很小,這時候犧牲空間換時間就顯得不值當了。另外,每處都盡可能使用內聯函數的話,將使程序的代碼量變大,多消耗很多空間。
以下情況不宜使用內聯:
(1)如果函數體內的代碼較長,使用內聯會導致消耗較多空間。
(2)如果函數體內出現循環,執行函數體內代碼的開銷要比調用函數開銷大。
一個好編譯器會自動取消不合理的內聯。
總結
- 上一篇: 排序算法——希尔排序(缩小增量排序)
- 下一篇: 结构体问题