❶ C++中內聯函數有什麼用處,具體該怎麼用
內聯函數必須是和函數體申明在一起,才有效。像這樣的申明Inline Tablefunction(int I)是沒有效果的,編譯器只是把函數作為普通的函數申明,我們必須定義函數體。
Inline tablefunction(int I) {return I*I};
這樣我們才算定義了一個內聯函數。我們可以把它作為一般的函數一樣調用。但是執行速度確比一般函數的執行速度要快。
我們也可以將定義在類的外部的函數定義為內聯函數,比如:
Class TableClass{
Private:
Int I,j;
Public:
Int add() { return I+j;};
Inline int dec() { return I-j;}
Int GetNum();
}
inline int tableclass::GetNum(){
return I;
}
上面申明的三個函數都是內聯函數。在C++中,在類的內部定義了函數體的函數,被默認為是內聯函數。而不管你是否有inline關鍵字。
內聯函數在C++類中,應用最廣的,應該是用來定義存取函數。我們定義的類中一般會把數據成員定義成私有的或者保護的,這樣,外界就不能直接讀寫我們類成員的數據了。對於私有或者保護成員的讀寫就必須使用成員介面函數來進行。如果我們把這些讀寫成員函數定義成內聯函數的話,將會獲得比較好的效率。
Class sample{
Private:
Int nTest;
Public:
Int readtest(){ return nTest;}
Void settest(int I) {nTest=I;}
}
當然,內聯函數也有一定的局限性。就是函數中的執行代碼不能太多了,如果,內聯函數的函數體過大,一般的編譯器會放棄內聯方式,而採用普通的方式調用函數。這樣,內聯函數就和普通函數執行效率一樣了。
❷ 什麼是內聯函數
在計算機科學中,內聯函數(有時稱作在線函數或編譯時期展開函數)是一種編程語言結構,用來建議編譯器對一些特殊函數進行內聯擴展(有時稱作在線擴展)。
內聯擴展是一種特別的用於消除調用函數時所造成的固有的時間消耗方法。一般用於能夠快速執行的函數,因為在這種情況下函數調用的時間消耗顯得更為突出。這種方法對於很小的函數也有空間上的益處,並且它也使得一些其他的優化成為可能。
沒有了內聯函式,程式員難以控制哪些函數內聯哪些不內聯;由編譯器自行決定是否內聯。加上這種控制維度准許特定於應用的知識,諸如執行函式的頻繁程度,被利用於選擇哪些函數要內聯。
此外,在一些語言中,內聯函數與編譯模型聯系緊密:如在C++中,有必要在每個使用它的模塊中定義一個內聯函數;與之相對應的,普通函數必須定義在單個模塊中。這使得模塊編譯獨立於其他的模塊。
(2)內斂函數在編譯時擴展閱讀:
在C++中我們通常定義以下函數來求兩個整數的最大值:
代碼如下:
int max(int a, int b)
{
return a > b ? a : b;
}
為這么一個小的操作定義一個函數的好處有:
① 閱讀和理解函數 max 的調用,要比讀一條等價的條件表達式並解釋它的含義要容易得多
② 如果需要做任何修改,修改函數要比找出並修改每一處等價表達式容易得多
③ 使用函數可以確保統一的行為,每個測試都保證以相同的方式實現
④ 函數可以重用,不必為其他應用程序重寫代碼
雖然有這么多好處,但是寫成函數有一個潛在的缺點:調用函數比求解等價表達式要慢得多。在大多數的機器上,調用函數都要做很多工作:調用前要先保存寄存器,並在返回時恢復,復制實參,程序還必須轉向一個新位置執行
C++中支持內聯函數,其目的是為了提高函數的執行效率,用關鍵字 inline 放在函數定義(注意是定義而非聲明,下文繼續講到)的前面即可將函數指定為內聯函數,內聯函數通常就是將它在程序中的每個調用點上「內聯地」展開。
內聯函數應該在頭文件中定義,這一點不同於其他函數。編譯器在調用點內聯展開函數的代碼時,必須能夠找到 inline 函數的定義才能將調用函數替換為函數代碼,而對於在頭文件中僅有函數聲明是不夠的。
當然內聯函數定義也可以放在源文件中,但此時只有定義的那個源文件可以用它,而且必須為每個源文件拷貝一份定義(即每個源文件里的定義必須是完全相同的),當然即使是放在頭文件中,也是對每個定義做一份拷貝,只不過是編譯器替你完成這種拷貝罷了。
但相比於放在源文件中,放在頭文件中既能夠確保調用函數是定義是相同的,又能夠保證在調用點能夠找到函數定義從而完成內聯(替換)。
❸ 編譯時,系統對內聯函數是如何處理的
編譯器看到inline後,為該函數創建一段代碼,以便在後面每次碰到該函數的調用都用相應的一段代碼來替換。
❹ C++中內聯函數的含義,不是很理解他和一般函數的區別。請高手指點一下,具體它的優點在哪裡謝謝
內聯函數在編譯的時候會用函數內的語句代替函數,相當你你在調用函數的位置重新寫了一遍你要調的函數,而非內聯函數是在內存中有獨立的代碼段,在調用的時候都是讀的這個代碼段,不會展開,執行的時候會有遠程讀代碼的時間開銷.
❺ 內聯函數的定義對編譯器而言必須是可見的什麼意思
解答其實已經說得很清楚了,編譯器在看到程序中調用普通函數的代碼時,是在這里填一個函數的地址,然後在執行時跳轉到函數那邊去。而碰到內聯函數時,是將函數的內容全部在調用點展開,所以它必須知道這個內聯函數的定義是什麼,否則無法展開。而將內聯函數的定義放在頭文件(.h)中,一旦include了該頭文件,就能看到內聯函數的全部內容了,也就可以在調用點完全展開內聯函數。如果將內聯函數放在源文件中(.c),編譯器在看到內聯函數的調用時,是無法知道內聯函數的內容的,因此也無法展開,所以必須將內聯函數定義在頭文件中。
❻ 內聯函數與普通函數比較,在聲明、編譯時有什麼不同
在類聲明的內部聲明或定義的成員函數叫做內聯(INLINE)函數.
引入內聯函數的目的是為了解決程序中函數調用的效率問題。
在程序編譯時,編譯器將程序中出現的內聯函數的調用表達式用內聯函數的函數體來進行替換。顯然,這種做法不會產生轉去轉回的問題,但是由於在編譯時將函數體中的代碼被替代到程序中,因此會增加目標程序代碼量,進而增加空間開銷,而在時間代銷上不象函數調用時那麼大,可見它是以目標代碼的增加為代價來換取時間的節省。
在程序中,調用其函數時,該函數在編譯時被替代,而不是像一般函數那樣是在運行時被調用。
函數調用也會帶來降低效率的問題,因為調用函數實際上將程序執行順序轉移到函數所存放在內存中某個地址,將函數的程序內容執行完後,再返回到轉去執行該函數前的地方。這種轉移操作要求在轉去前要保護現場並記憶執行的地址,轉回後先要恢復現場,並按原來保存地址繼續執行。因此,函數調用要有一定的時間和空間方面的開銷,於是將影響其效率。特別是對於一些函數體代碼不是很大,但又頻繁地被調用的函數來講,解決其效率問題更為重要。引入內聯函數實際上就是為了解決這一問題。
❼ C++內聯函數具體有什麼作用
內聯函數可減少cpu的系統開銷,並且程序的整體速度將加快,但當內聯函數很大時,會有相反的作用,因此一般比較小的函數才使用內聯函數。
內聯函數是C++的增強特性之一,用來降低程序的運行時間。當內聯函數收到編譯器的指示時,即可發生內聯:編譯器將使用函數的定義體來替代函數調用語句,這種替代行為發生在編譯階段而非程序運行階段。
值得注意的是,內聯函數僅僅是對編譯器的內聯建議,編譯器是否覺得採取你的建議取決於函數是否符合內聯的有利條件。如何函數體非常大,那麼編譯器將忽略函數的內聯聲明,而將內聯函數作為普通函數處理。
內聯函數具有一般函數的特性,它與一般函數所不同之處公在於函數調用的處理。一般函數進行調用時,要將程序執行權轉到被調用函數中,然後再返回到調用它的函數中;而內聯函數在調用時,是將調用表達式用內聯函數體來替換。在使用內聯函數時,應注意如下幾點:
1、類內定義的函數是內聯函數,類外定義的函數是非內聯函數(短函數可以定義在類內,長函數可以定義在類外)。
2、可以為類外定義的函數指定 inline 關鍵字,強行為內聯函數。
3、在內聯函數內不允許用循環語句和開關語句。
4、內聯函數的定義必須出現在內聯函數第一次被調用之前。
❽ C++中的內聯函數是在編譯時原地展開的還是在運行時原地展開的
編譯時就確定了調用次數的 所以是編譯器就展開
❾ 內聯函數在編譯時是否做參數類型檢查
這是必須滴啊。
❿ 內聯成員函數的優缺點【C++】
優點是提高運行時間效率,缺點是增加了空間開銷
對於普通函數,函數調用需要時間和空間開銷,調用函數實際上將程序執行流程轉移到被調函數中,被調函數的代碼執行完後,再返回到調用的地方。這種調用操作要求調用前保護好現場並記憶執行的地址,返回後恢復現場,並按原來保存的地址繼續執行。對於較長的函數這種開銷可以忽略不計,但對於一些函數體代碼很短,又被頻繁調用的函數,就不能忽視這種開銷。引入內聯函數正是為了解決這個問題,提高程序的運行效率。
對於內聯函數,在程序編譯時,編譯器將程序中出現的內聯函數的調用表達式用內聯函數的函數體來進行替換。由於在編譯時將內聯函數體中的代碼替代到程序中,因此會增加目標程序代碼量,進而增加空間開銷,而在時間開銷上不象函數調用時那麼大,可見它是以目標代碼的增加為代價來換取時間的節省。