mysql 内联函数_C++之内联函数
C++繼承C的一個(gè)重要特性是效率,在C中保護(hù)效率的一個(gè)方法是使用宏(macro),宏的實(shí)現(xiàn)是使用預(yù)處理器而不是編譯器,預(yù)處理器直接用宏代碼替換宏調(diào)用,所以就沒有了參數(shù)壓棧、生成匯編語言的CALL、返回參數(shù)、執(zhí)行匯編語言的RETURN的時(shí)間花費(fèi),所有的工作由預(yù)處理器完成,因此不用花費(fèi)什么就具有了程序調(diào)用的便利和可讀性。
C++中使用預(yù)處理器宏存在兩個(gè)問題,一是不安全性,二是C++特有的,預(yù)處理器不容許存取私有數(shù)據(jù),這意味著預(yù)處理器在用作成員函數(shù)時(shí)變得非常無用。
為了既保持預(yù)處理器宏的效率又增加安全性,而且還能像一般的成員函數(shù)一樣可以在類里訪問自如,C++使用了內(nèi)聯(lián)函數(shù)。
內(nèi)聯(lián)函數(shù)與編譯器
內(nèi)聯(lián)函數(shù)使用inline關(guān)鍵字定義,為了使之有效,必須使函數(shù)體和聲明結(jié)合在一起,否則,編譯器將它作為普通函數(shù)對(duì)待
一般應(yīng)該把內(nèi)聯(lián)定義在頭文件中,當(dāng)編譯器看到這個(gè)定義時(shí),它把函數(shù)類型(函數(shù)名+返回值)和函數(shù)體放到符號(hào)表里,當(dāng)使用函數(shù)時(shí),編譯器檢查以確保調(diào)用和返回是否正確,然后將函數(shù)調(diào)用替換為函數(shù)體,因而消除了開銷,內(nèi)聯(lián)代碼的確占用空間,但假如函數(shù)較小,這實(shí)際比為了一個(gè)普通函數(shù)調(diào)用而產(chǎn)生的代碼(參數(shù)壓棧和執(zhí)行CALL)占用的空間少。
1. 局限性
編譯器在以下兩種情況下不能處理內(nèi)聯(lián):
(1) 函數(shù)體很大或很復(fù)雜,任何種類的循環(huán)都被認(rèn)為太復(fù)雜,編譯器遇到這種情況都會(huì)放棄內(nèi)聯(lián)方式,因?yàn)檫@時(shí)內(nèi)聯(lián)將可能不為我們提供任何效率
(2) 假如我們要顯示或隱含地取函數(shù)地址,編譯器也不能執(zhí)行內(nèi)聯(lián),因?yàn)檫@時(shí)編譯器必須為函數(shù)代碼分配內(nèi)存從而為我們產(chǎn)生一個(gè)函數(shù)的地址。
我們必須理解內(nèi)聯(lián)僅僅是編譯器的一個(gè)建議,編譯器不強(qiáng)迫內(nèi)聯(lián)任何代碼,一個(gè)好的編譯器將會(huì)內(nèi)聯(lián)小的,簡(jiǎn)單的函數(shù),同時(shí)明智的忽略那些太負(fù)責(zé)的內(nèi)聯(lián)
2. 賦值順序
classforward
{public:
forward():i(0){}int f() const {return g() + 1;} // 注意int g() const {returni;}private:inti;
};voidmain()
{
forward F;
F.f();return;
}
觀察上面的代碼,雖然函數(shù)g()還沒有定義,但在函數(shù)f()里對(duì)函數(shù)g()進(jìn)行了調(diào)用,編譯器會(huì)不會(huì)報(bào)錯(cuò)呢?
事實(shí)上這是可行的,因?yàn)檎Z言定義規(guī)定非內(nèi)聯(lián)函數(shù)直到類聲明結(jié)束才賦值。
假如一個(gè)內(nèi)聯(lián)函數(shù)對(duì)于一個(gè)還沒有在內(nèi)里面聲明的函數(shù)進(jìn)行向前引用,編譯器就不會(huì)把它當(dāng)做內(nèi)聯(lián)函數(shù)處理!
錯(cuò)誤檢查示例
inline void allege_error(int nVal, char *cMsg)
{if (!nVal)
{
fprintf(stderr, cMsg);
}
#ifdef NDEBUG
exit(1);#endif}#define allege(expr, msg)\{\
allege_error((expr? 1:0), msg);\
assert(expr);\
}#define allegemem(expr)\{\
allege(expr,"out of memory");\
}#define allegefile(expr)\{\
allege(expr,"could not open file\r\n");\
}voidmain()
{
ifstream nofile;
nofile.open("nofile.xxx", ios::in);
allegefile(nofile);return;
}
#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
assert()宏中包含__FILE__和__LINE__
總結(jié)
以上是生活随笔為你收集整理的mysql 内联函数_C++之内联函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php ip2long mysql,PH
- 下一篇: setid android,androi