內(nèi)聯(lián)函數(shù)
函數(shù)的調(diào)用
執(zhí)行到函數(shù)調(diào)用指令時(shí),程序?qū)⒃诤瘮?shù)在調(diào)用后立即存儲該指令的內(nèi)存地址概荷,并將函數(shù)參數(shù)復(fù)制到堆棧(為此保留的內(nèi)存塊)秕岛,跳到標(biāo)記函數(shù)起點(diǎn)的內(nèi)存單元,執(zhí)行函數(shù)代碼(也許還需要返回值放入寄存器中)误证,然后跳回到地址被保存的指令處继薛。
內(nèi)聯(lián)函數(shù)的說明
內(nèi)聯(lián)函數(shù)提供了不一樣的選擇。編輯器將使用相應(yīng)的函數(shù)代碼替代函數(shù)滴啊用愈捅。因此遏考,內(nèi)聯(lián)函數(shù)的運(yùn)行速度比常規(guī)函數(shù)快一點(diǎn),但是會增大代碼體積
內(nèi)聯(lián)函數(shù)的使用
- 使用inline 修飾函數(shù)的聲明或者實(shí)現(xiàn)蓝谨,可以使其變成內(nèi)聯(lián)函數(shù)
- 建議聲明和實(shí)現(xiàn)都增加inline修飾
特點(diǎn)
- 編譯器會將函數(shù)滴啊用直接展開為函數(shù)代碼
- 可以減少函數(shù)調(diào)用開銷
- 會增大代碼體積
#include <iostream>
using namespace std;
inline int sum (int a, int b){
return a + b;
}
int main(){
cout << "1 + 2 = " << sum(1, 2) << endl;
return 0;
}
注意
- 盡量不要內(nèi)聯(lián)超過10行代碼的函數(shù)
- 有些函數(shù)即使聲明為inline灌具,也不一定會被編譯器內(nèi)聯(lián),比如遞歸函數(shù)
內(nèi)聯(lián)函數(shù)和宏定義的區(qū)別
C語言使用預(yù)處理器#define來提供宏譬巫。如:
#define sum(a,b) ((a) + (b))
宏定義和內(nèi)聯(lián)函數(shù)存在本質(zhì)的區(qū)別咖楣,轉(zhuǎn)換的時(shí)候應(yīng)考慮是否轉(zhuǎn)換后功能是否正常
- 內(nèi)聯(lián)函數(shù)保存了函數(shù)的功能,但是宏定義不一定
- 內(nèi)聯(lián)函數(shù)在編寫的時(shí)候可以檢查錯(cuò)誤芦昔,但是宏定義的話诱贿,需要使用的時(shí)候才能檢查到錯(cuò)誤
#pragma once
- 我們經(jīng)常使用#ifndef、#define咕缎、#endif來防止頭文件的內(nèi)容被重復(fù)包含,如
#ifndef test_h
#define test_h
#include <stdio.h>
#endif /* test_h */
#pragma once 可以防止整個(gè)文件的內(nèi)容被重復(fù)包含
二者的區(qū)別
- 在c\c++中#ifndef珠十、#define咸作、#endif受到標(biāo)準(zhǔn)支持,不受編譯器的任何限制
- 有些編譯器不支持#pragma once(叫老的編譯器不支持宵睦,如GCC 3.4版本之前)记罚,兼容性好不好
- 而#ifndef、#define壳嚎、#endif可以針對一個(gè)文件中的部分代碼桐智,二#pragma once只能針對整個(gè)文件