mysql 内联函数_C++之内联函数
C++繼承C的一個重要特性是效率,在C中保護效率的一個方法是使用宏(macro),宏的實現是使用預處理器而不是編譯器,預處理器直接用宏代碼替換宏調用,所以就沒有了參數壓棧、生成匯編語言的CALL、返回參數、執行匯編語言的RETURN的時間花費,所有的工作由預處理器完成,因此不用花費什么就具有了程序調用的便利和可讀性。
C++中使用預處理器宏存在兩個問題,一是不安全性,二是C++特有的,預處理器不容許存取私有數據,這意味著預處理器在用作成員函數時變得非常無用。
為了既保持預處理器宏的效率又增加安全性,而且還能像一般的成員函數一樣可以在類里訪問自如,C++使用了內聯函數。
內聯函數與編譯器
內聯函數使用inline關鍵字定義,為了使之有效,必須使函數體和聲明結合在一起,否則,編譯器將它作為普通函數對待
一般應該把內聯定義在頭文件中,當編譯器看到這個定義時,它把函數類型(函數名+返回值)和函數體放到符號表里,當使用函數時,編譯器檢查以確保調用和返回是否正確,然后將函數調用替換為函數體,因而消除了開銷,內聯代碼的確占用空間,但假如函數較小,這實際比為了一個普通函數調用而產生的代碼(參數壓棧和執行CALL)占用的空間少。
1. 局限性
編譯器在以下兩種情況下不能處理內聯:
(1) 函數體很大或很復雜,任何種類的循環都被認為太復雜,編譯器遇到這種情況都會放棄內聯方式,因為這時內聯將可能不為我們提供任何效率
(2) 假如我們要顯示或隱含地取函數地址,編譯器也不能執行內聯,因為這時編譯器必須為函數代碼分配內存從而為我們產生一個函數的地址。
我們必須理解內聯僅僅是編譯器的一個建議,編譯器不強迫內聯任何代碼,一個好的編譯器將會內聯小的,簡單的函數,同時明智的忽略那些太負責的內聯
2. 賦值順序
classforward
{public:
forward():i(0){}int f() const {return g() + 1;} // 注意int g() const {returni;}private:inti;
};voidmain()
{
forward F;
F.f();return;
}
觀察上面的代碼,雖然函數g()還沒有定義,但在函數f()里對函數g()進行了調用,編譯器會不會報錯呢?
事實上這是可行的,因為語言定義規定非內聯函數直到類聲明結束才賦值。
假如一個內聯函數對于一個還沒有在內里面聲明的函數進行向前引用,編譯器就不會把它當做內聯函數處理!
錯誤檢查示例
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__
總結
以上是生活随笔為你收集整理的mysql 内联函数_C++之内联函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php ip2long mysql,PH
- 下一篇: setid android,androi