欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
inline用法與作用
   內聯(lián)函數是一種編譯機制,優(yōu)點(diǎn)從代碼上是看不出來(lái)的,但是程序的執行效率上有差別,通常,編譯器對函數調用的處理是一種類(lèi)似中斷的方式,即當執行到函數調用語(yǔ)句時(shí),程序把當前所有的狀態(tài)信息比如CPU所有寄存器(其中一個(gè)很重要的就是指令指針寄存器)的值保存起來(lái),然后放心大膽地轉去執行那個(gè)函數的代碼,執行完后再返回原來(lái)的地方,恢復原先保存過(guò)的狀態(tài)信息,于是也就可以接著(zhù)原來(lái)被中斷的指令繼續往下執行。這樣,就很容易實(shí)現代碼的結構化,因為可以把一些獨立的功能模塊寫(xiě)成函數,函數內部的變量和外部的變量互不影響,而且函數執行完后就可以釋放這個(gè)函數內部變量的所使用的內存空間(這就是為什么函數退出后,其內部變量不再有效),對內存的使用也是很經(jīng)濟的(否則,如果一個(gè)大的程序全部由一個(gè)函數組成,那么所有的變量都得自始至終地占用內存空間),當然,還有其他優(yōu)點(diǎn),比如可以實(shí)現遞歸,總之是好處多多。 
        可是,任何事情往往都有兩方面,這樣做雖然好處多多,但也是有代價(jià)的,那就是前面所說(shuō)的,任何一次函數調用,程序都得進(jìn)行保存和恢復狀態(tài)信息的動(dòng)作,用數據結構的術(shù)語(yǔ)說(shuō)就是進(jìn)棧和退棧,當然,還有內存分配的過(guò)程,如果函數的代碼非常少,這種代價(jià)并不是可忽略的,比如說(shuō),你編寫(xiě)一個(gè)類(lèi),里面有個(gè)記錄狀態(tài)的成員變量:
Class MyClass
{
        private:
        int m_iState;

        按照面向對象的思想,函數的屬性應盡量的私有化,但外部怎么獲得這個(gè)屬性值呢?一般的方法就是加一個(gè)共有函數,這就實(shí)現的面向對象思想中所謂“通過(guò)公用接口操作對象的私有屬性”。于是就變成了:
Class MyClass

        public: 
        int GetState(); 
        private: 
        int m_iState;
}

int MyClass::GetState()

        return m_iState;

        這樣一來(lái),面向對象思想倒是體現出來(lái)了,但你的CPU會(huì )恨你:“你丫一個(gè)鳥(niǎo)函數就返回一個(gè)整數卻讓老子進(jìn)一次棧、彈一次棧”,內存也會(huì )埋怨:“兄弟也得跟著(zhù)分配內存!” 
        但對你來(lái)說(shuō),也很委屈,怎么辦,把所有的屬性都改成public?讓外部?jì)却a直接訪(fǎng)問(wèn)?況且,那樣也不解決所有問(wèn)題,因為有時(shí)候即使不是為了面向對象,我們也需要把獨立的功能模塊做成函數,比如說(shuō)產(chǎn)生隨機數的函數。我想
int iRand=rand();
總比:
int iRand=((int)(MULTIPLIER * Seed + INCREMENT)>>16)&0x7fff;
看起來(lái)舒服吧?(我這里只是打個(gè)比方,VC的rand函數并不是內聯(lián)函數) 
        而內聯(lián)函數就是解決這個(gè)問(wèn)題了,對于程序員,他還是把獨立功能寫(xiě)成函數的形式,但只要聲明為內聯(lián),編譯器就不把它編譯成一次函數調用,而只是類(lèi)似于把函數的代碼拷貝到被調用的地方,而且這完全是編譯器私下里完成的,原來(lái)的訪(fǎng)問(wèn)權限等問(wèn)題絲毫不受影響。這不是兩全齊美了嗎:在保證代碼的面向對象性和結構化不受損失的條件下,程序的效率也沒(méi)有損失,比如上面那個(gè)類(lèi),就變成了:
Class MyClass

        public: 
        inline int GetState(); 
        private: 
        int m_iState;
}

int inline MyClass::GetState()

        return m_iState;

        有一點(diǎn)要注意,內聯(lián)函數要跟類(lèi)的聲明寫(xiě)在同一個(gè)文件中,否則編譯會(huì )出錯。按照VC管理源文件的風(fēng)格來(lái)說(shuō),就是內聯(lián)函數最好寫(xiě)在聲明類(lèi)的.h文件中,而不是像一般函數那樣寫(xiě)在實(shí)現類(lèi)的.cpp文件中。 
        當然,內聯(lián)函數還有另外一種寫(xiě)法,就是直接寫(xiě)在類(lèi)中,此時(shí),不必使用“inline”關(guān)鍵字。
Class MyClass

        public: 
        int GetState(){ return m_iState; } 
        private: 
        int m_iState;

        最后,還要注意,內聯(lián)函數只是一種編譯機制,用上面兩種形式聲明的函數僅僅是建議編譯器進(jìn)行內聯(lián),而編譯器是否內聯(lián)不一定。正如前面所說(shuō),函數調用的開(kāi)銷(xiāo)只是對小的函數不可忽略,對于重量級的函數還是可以忽略的,而且在絕大多數的場(chǎng)合,函數調用才是人間正道,才是解決問(wèn)題的最佳。所以大多數編譯器并不把帶有循環(huán)、遞歸等或者代碼比較多的函數進(jìn)行內聯(lián)編譯,有的甚至不允許聲明成內聯(lián)的。   
        在解決C + +中宏存取私有的類(lèi)成員的問(wèn)題過(guò)程中,所有和預處理器宏有關(guān)的問(wèn)題也隨著(zhù)消失了。這是通過(guò)使宏被編譯器控制來(lái)實(shí)現的。在C + +中,宏的概念是作為內聯(lián)函數來(lái)實(shí)現的,而內聯(lián)函數無(wú)論在任何意義上都是真正的函數。唯一不同之處是內聯(lián)函數在適當時(shí)像宏一樣展開(kāi),所以函數調用的開(kāi)銷(xiāo)被取消。因此,應該永遠不使用宏,只使用內聯(lián)函數。 
        任何在類(lèi)中定義的函數自動(dòng)地成為內聯(lián)函數,但也可以使用i n l i n e關(guān)鍵字放在類(lèi)外定義的函數前面使之成為內聯(lián)函數。但為了使之有效,必須使函數體和聲明結合在一起,否則,編譯器將它作為普通函數對待。因此
inline int PlusOne(int x);
沒(méi)有任何效果,僅僅只是聲明函數(這不一定能夠在稍后某個(gè)時(shí)候得到一個(gè)內聯(lián)定義)。成功的方法如下:
inline int PlusOne(int x) { return ++x ;} 
        注意,編譯器將檢查函數參數列表使用是否正確,并返回值(進(jìn)行必要的轉換)。這些事情是預處理器無(wú)法完成的。假如對于上面的內聯(lián)函數,我們寫(xiě)成一個(gè)預處理器宏的話(huà),將有不想要的副作用。 
        一般應該把內聯(lián)定義放在頭文件里。當編譯器看到這個(gè)定義時(shí),它把函數類(lèi)型(函數名+返回值)和函數體放到符號表里。當使用函數時(shí),編譯器檢查以確保調用是正確的且返回值被正確使用,然后將函數調用替換為函數體,因而消除了開(kāi)銷(xiāo)。內聯(lián)代碼的確占用空間,但假如函數較小,這實(shí)際上比為了一個(gè)普通函數調用而產(chǎn)生的代碼(參數壓棧和執行C A L L)占用的空間還少。在頭文件里,內聯(lián)函數默認為內部連接——即它是static, 并且只能在它被包含的編譯單元看到。因而,只要它們不在相同的編譯單元中聲明,在內聯(lián)函數和全局函數之間用同樣的名字也不會(huì )在連接時(shí)產(chǎn)生沖突。 
        為了定義內聯(lián)函數,通常必須在函數定義前面放一個(gè)i n l i n e關(guān)鍵字。但這在類(lèi)內部定義內聯(lián)函數時(shí)并不是必須的。任何在類(lèi)內部定義的函數自動(dòng)地為內聯(lián)函數。如下例:
#include <iostream.h>
class point{ 
        private: 
        int i,j,k; 
        public: 
                point() {i=j=k=0; } 
        point(int I,int J,int K) { 
                i=I; 
                j=J 
                k=K; 
        } 
        void print(const char* msg="") const{ 
                if(*msg) cout<<"msg"<<endl; 
                cout<<"i="<<i<<endl; 
                cout<<"j="<<j<<endl; 
                cout<<"k="<<k<<endl; 
        }
};

main(){ 
        point p,q(1,2,3); 
        p.print("value of p"); 
        q.print("value of q");
}

當然,因為類(lèi)內部的內聯(lián)函數節省了在外部定義成員函數的額外步驟,所以我們一定想在類(lèi)聲明內每一處都使用內聯(lián)函數。但應記住,內聯(lián)的目的是減少函數調用的開(kāi)銷(xiāo)。假如函數較大,那么花費在函數體內的時(shí)間相對于進(jìn)出函數的時(shí)間的比例就會(huì )較大,所以收獲會(huì )較小。而且內聯(lián)一個(gè)大函數將會(huì )使該函數所有被調用的地方都做代碼復制,結果代碼膨脹而在速度方面獲得的好處卻很少或者沒(méi)有。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
08、C++ 內聯(lián)函數
問(wèn)專(zhuān)家-內聯(lián)函數與普通函數的區別是什么
C++最佳實(shí)踐 | 2. 代碼風(fēng)格 - 簡(jiǎn)書(shū)
宏、內聯(lián)函數和普通函數的區別
函數實(shí)現不放在頭文件的原因,及何時(shí)可以放頭文件的情況
內聯(lián)函數
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久