c成員函式是不是都是行內函數,內聯成員函式的優缺點 C

2021-05-14 08:36:48 字數 5438 閱讀 2656

1樓:匿名使用者

當然不是,或者說,除非特殊的inline宣告,類成員函式都不是行內函數。

內聯成員函式的優缺點【c++】

2樓:匿名使用者

行內函數必須是和函式體申明在一起,才有效。像這樣的申明inline tablefunction(int i)是沒有效果的,編譯器只是把函式作為普通的函式申明,我們必須定義函式體。

inline tablefunction(int i) ;

這樣我們才算定義了一個行內函數。我們可以把它作為一般的函式一樣呼叫。但是執行速度確比一般函式的執行速度要快。

我們也可以將定義在類的外部的函式定義為行內函數,比如:

class tableclass

inline int tableclass::getnum()

上面申明的三個函式都是行內函數。在c++中,在類的內部定義了函式體的函式,被預設為是行內函數。而不管你是否有inline關鍵字。

行內函數在c++類中,應用最廣的,應該是用來定義存取函式。我們定義的類中一般會把資料成員定義成私有的或者保護的,這樣,外界就不能直接讀寫我們類成員的資料了。對於私有或者保護成員的讀寫就必須使用成員介面函式來進行。

如果我們把這些讀寫成員函式定義成行內函數的話,將會獲得比較好的效率。

class sample

當然,行內函數也有一定的侷限性。就是函式中的執行**不能太多了,如果,行內函數的函式體過大,一般的編譯器會放棄內聯方式,而採用普通的方式呼叫函式。這樣,行內函數就和普通函式執行效率一樣了。

3樓:

優點是提高執行時間效率,缺點是增加了空間開銷

對於普通函式,函式呼叫需要時間和空間開銷,呼叫函式實際上將程式執行流程轉移到被調函式中,被調函式的**執行完後,再返回到呼叫的地方。這種呼叫操作要求呼叫前保護好現場並記憶執行的地址,返回後恢復現場,並按原來儲存的地址繼續執行。對於較長的函式這種開銷可以忽略不計,但對於一些函式體**很短,又被頻繁呼叫的函式,就不能忽視這種開銷。

引入行內函數正是為了解決這個問題,提高程式的執行效率。

對於行內函數,在程式編譯時,編譯器將程式中出現的行內函數的呼叫表示式用行內函數的函式體來進行替換。由於在編譯時將行內函數體中的**替代到程式中,因此會增加目標程式**量,進而增加空間開銷,而在時間開銷上不象函式呼叫時那麼大,可見它是以目標**的增加為代價來換取時間的節省。

4樓:匿名使用者

普通函式的話,呼叫時給個記憶體地址進行跳轉,完成後跳轉回來行內函數的話,直接就把處理指令加到呼叫的位置也就是普通函式只有一份函式指令拷貝,行內函數有多少次呼叫就要多少個函式指令拷貝

執行效率的提高就是主要因為少了跳轉

c++中怎麼理解類內定義的成員函式就是行內函數? 200

5樓:波多貝羅的巫師

在類內定義的成員函式預設為inline,不論前面是否加了inline,當然,是否內聯還是取決於編譯器啦~而在類外定義的成員函式就不是行內函數。

類體外定義成員函式和 內聯成員函式有什麼區別

6樓:匿名使用者

行內函數

在類宣告內定義行內函數

行內函數

在c++中,使用者可以建立實際上不呼叫的短函式,他們的**在每次呼叫的程式行裡得到擴充套件。這個過程類似於使用類似函式的巨集。為使一個函式在程式行進行**擴充套件而不被呼叫,只要在函式前面加上關鍵字inline即可。

例如,在下面的程式,函式max()在行內擴充套件而不被呼叫:

#include

using namespace std;

inline int max(int a, int b)

int main()

行內函數是c++的一個重要補充的原因是,他們能使程式設計師寫出非常有效的**。因為類一般要求幾個經常被執行的介面函式,因此,這些函式的效率在c++中是非常重要的。我們知道,每次呼叫函式時,變元要進棧,各種暫存器內容要儲存;函式返回時,又要恢復他們的內容。

問題是這些指令要佔用時間。但是,如果函式在行內擴充套件,上述那些操作就不存在了。當然,雖然函式行內擴充套件能產生較快的速度,但由於重複編碼會產生較長的**,因此最好只內聯那些能明顯影響程式效能的函式。

inline對編譯器是一種請求,而不是命令。編譯器可以選擇忽略它。還有,一些編譯器不能內聯所有型別的函式。

例如,通常編譯器不能內聯遞迴函式。必須查閱自己的編譯器使用者手冊以瞭解對內聯的限制。如果一個函式不能被內聯,它就被當作一個正常的函式呼叫。

inline關鍵字不是c++的 c子集 的一部分,因此,c89沒有定義它,然而,c99中增加了它。

行內函數可以是類的成員。

class myclass;

inline void myclass::init(int i,int j)

inline void myclass::show()

void show(){cout<

建構函式和解構函式也可以是內聯的。

——————————————————————————————————————————

c++參考大全(第四版)

7樓:莫謹瑜

還是有點區別的,c++提供的行內函數在編譯時與程式中其他**聯在一塊了,就是說編譯器將行內函數的**替換了函式呼叫。行內函數不用像類外定義的其他成員函式一樣調來調去,所以使用行內函數的一個優點是執行速度稍快,但缺點是佔更多的記憶體。因此行內函數適用於一些簡單的**,比如求和,求差等等。

8樓:captainz鈥唊

區別大了,行內函數看著像函式其實編譯後他就不是函式了,他只是內斂的函式體內的部分。所以他沒有函式地址;

c++在類外部定義的成員函式是不是inline函式,沒有在內部宣告為inline

9樓:薩珺堵雁山

寫在類體內的成員函式和inline開頭寫在類外的成員函式,以及inline開頭的非類成員函式是行內函數

10樓:

etiu2009你的概念有誤,你可以去翻c++ primer,在類內定義的函式預設為inline。

對於簡單的函式,前面可以顯式加上inline表示是行內函數,這樣編譯器就會在呼叫處**,提高執行效率。你在成員函式前加inline,在類外定義還是行內函數。不過這只是一種請求式的宣告,因為一個有幾百行或者迴圈的函式是不可能inline的。

11樓:匿名使用者

是否 inline 和是否在類內部定義沒有必然的聯絡。

你可以在你的函式頭部加上 inline 關鍵字強制開啟內聯,但編譯器仍然會對此做優化。

即使沒有加 inline 關鍵字的函式,如果呼叫次數不多或者**很簡單,編譯器會自動把它轉為 inline;反之亦然,即使加了 inline 關鍵字,某些呼叫頻繁或**比較複雜的函式,編譯器亦然會把它專為非 inline。

c++中行內函數是什麼意思?

12樓:匿名使用者

行內函數具有一般函式的特性,它與一般函式所不同之處只在於函式呼叫的處理。一般函式進行呼叫時,要將程式執行權轉到被呼叫函式中,然後再返回到呼叫它的函式中;而行內函數在呼叫時,是將呼叫表示式用行內函數體來替換。在使用行內函數時,應注意如下幾點:

1.在行內函數內不允許用迴圈語句和開關語句。

如果行內函數有這些語句,則編譯將該函式視同普通函式那樣產生函式呼叫**,遞迴函式(自己呼叫自己的函式)是不能被用來做行內函數的。行內函數只適合於只有1~5行的小函式。對一個含有許多語句的大函式,函式呼叫和返回的開銷相對來說微不足道,所以也沒有必要用行內函數實現。

2.行內函數的定義必須出現在行內函數第一次被呼叫之前。

3.本欄目講到的類結構中所有在類說明內部定義的函式是行內函數。

13樓:匿名使用者

在類宣告的內部宣告或定義的成員函式叫做內聯(inline)函式.

有兩種實現方式:

1.在類宣告的內部宣告,而在類宣告外部定義叫做顯式行內函數,如:

class display

display object;

inline void display::output(void)2.在類宣告的內部定義,叫做隱式行內函數,如:

class display

} 引入行內函數的目的是為了解決程式中函式呼叫的效率問題。

函式是一種更高階的抽象。它的引入使得程式設計者只關心函式的功能和使用方法,而不必關心函式功能的具體實現;函式的引入可以減少程式的目標**,實現程式**和資料的共享。但是,函式呼叫也會帶來降低效率的問題,因為呼叫函式實際上將程式執行順序轉移到函式所存放在記憶體中某個地址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。

這種轉移操作要求在轉去前要保護現場並記憶執行的地址,轉回後先要恢復現場,並按原來儲存地址繼續執行。因此,函式呼叫要有一定的時間和空間方面的開銷,於是將影響其效率。特別是對於一些函式體**不是很大,但又頻繁地被呼叫的函式來講,解決其效率問題更為重要。

引入行內函數實際上就是為了解決這一問題。

14樓:悟葛戰芮安

這最初是用來取代引數巨集的,因為巨集是由前處理器處理,編譯器並不知情,所以會存在一定問題,故設計行內函數來取代帶引數的巨集,以由編譯器接管這一“職務”,這樣就能進行型別檢查,且不會對引數進行多次求值。

但一般情況inline關鍵字只是給編譯器的建議,編譯器若認為函式足夠複雜(即函式體的開銷遠遠高於函式呼叫的開銷),則不會進行內聯。

c++行內函數和普通函式的區別

15樓:八哥說科技

1、編譯結果不同:

2、編譯的時間不同:

對於基於c的編譯系統,行內函數的使用可能大大增加編譯時間,因為每個呼叫該函式的地方都需要替換成函式體,**量的增加也同時帶來了潛在的編譯時間的增加。

3、執行的效率不同:

使用行內函數時,必須在程式佔用空間和程式執行效率之間進行權衡,因為過多的比較複雜的函式進行內聯擴充套件將帶來很大的儲存資源開支。

16樓:匿名使用者

行內函數是一種以空間換取時間的機制,提高時間效率,一般**少,無迴圈,無遞迴的函式才考慮使用!

17樓:醉棋

行內函數在編譯層面類似於巨集替換。也就是說,程式執行過程中呼叫行內函數不需要入棧出棧,所以效率會提高。

18樓:飛翔的菜菜

沒有區別,只是加一個inline關鍵字而已,如果說是區別,就是說它是包含在類裡面的,雖然在外面定義,如果沒有inline關鍵字,那就是在外部的函式,不屬於這個類

19樓:程式設計師聚集地

只有三二行的**,建議使用內聯!

這樣執行速度會很快,因為加入了inline 可以減少了,跳入函式和跳出函式的步驟!

如果一個非常複雜的函式使用了inline 效果和沒有使用內聯一樣。。。

inline只是針對比較簡單的函式,建議使用!

c成員函式的行內函數能否在類外宣告

我想你把函式的定義和宣告兩個概念混淆了,可以定義在外面,但是宣告肯定是在類內啊。標頭檔案 class a 定義檔案 inline void a foo int x,int y 表明是一個行內函數 若是定義在類內,就是隱式內聯了,比如class a 可以,不過類內必須要有函式宣告 mfc自動生成的文件...

友元函式是全域性函式麼,C 成員函式 全域性函式 友員函式的區別

我這學期學了c 對友元和友元函式有一點認識,提供以下內容,僅供參考。1 友元的來歷 根據類的封裝性,一般將資料成員宣告為私有成員,在外部不能直接訪問它,只能通過類的公有成員函式對私有成員進行訪問。有時,需要頻繁呼叫成員函式來訪問私有成員,這樣系統開銷就比較大。c 從高效的角度出發,提供了友元機制,使...

類中宣告的函式是行內函數嗎?是類內宣告類外定義啊

在類中定義的成員函式全部預設為行內函數。可以顯示加上 inline 識別符號。或者不加 在類中宣告的成員函式,如果沒加inline。則在類外定義該成員函式時加了inline,該成員函式也為行內函數。綜上所述 不管是宣告還是定義,只要看見有 inline 都為內聯 可以的,區別是類中您給出了函式體,不...