成員函式一定是行內函數嗎,內聯成員函式的優缺點 C

時間 2021-09-02 20:56:46

1樓:韌勁

不是一、行內函數類似於c裡邊的巨集,只是巨集經常有一些不安全因素,比如 巨集定義 add() 是 a+b,呼叫的時候巨集定義直接,不做任何的判斷,如果呼叫res = add()*c; 得到的**就是res = a+b*c;不是想要的結果。

行內函數可以理解成一個安全的巨集定義,他就是一個真正的函式,只是不用壓棧出棧,速度快,而且比巨集定義安全,所以利用 短且頻率 比較高的函式可以寫成行內函數inline。

二、 行內函數在編譯時,會將此行內函數**直接編譯到呼叫函式之處。減少了一次函式呼叫時的跳轉、資料壓棧等操作。所以相比呼叫行數,行內函數的執行效率要相對高點。

不過也正因為如此,所以最終生成的程式檔案要稍微大點。

1.行內函數可減少cpu的系統開銷,並且提高整體程式的速度,但當行內函數很大時,會有相反的作用,因此一般比較小的函式才使用行內函數。

2.有兩種行內函數的宣告方法,一種是在函式前使用inline關鍵字;另一種是在類的內部定義函式的**,這樣的函式將自動轉換為行內函數,而且沒必要將inline放在函式前面。

3.內聯是一種對編譯器的請求,像register說明符一樣。下面這些情況會阻止編譯器服從這項請求.如果函式中包含有迴圈,switch或goto語句,遞迴函式,含有static的函式.

2樓:匿名使用者

不一定。當成員函式體寫在類的宣告內且無迴圈語句與switch語句時為行內函數,其餘為非行內函數

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

3樓:匿名使用者

當你的class。public成員函式宣告的時候,只要這個函式體當中不存在switch等迴圈語句的時候,則這個函式體無論是在類的內部還是類的外部,這個成員函式在編譯器看來,都等同於inline 行內函數了。

4樓:手機使用者

好像inline現在確實很少用了,編譯器都越來越智慧了

tenglvjun說的對,編譯器是否把函式編成內聯,它有自己的判斷,並不會因為你寫了inline就一定是內聯.就和register一樣,並不是加了register,編譯器就一定會把變數放到暫存器中

5樓:扶範西門靈秀

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

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

6樓:匿名使用者

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

inline tablefunction(int i) ;

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

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

class tableclass

inline int tableclass::getnum()

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

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

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

class sample

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

7樓:

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

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

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

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

8樓:匿名使用者

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

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

c++ 成員函式是不是都是行內函數

9樓:匿名使用者

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

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

10樓:波多貝羅的巫師

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

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

11樓:匿名使用者

在類中定義的成員函式全部預設為行內函數。可以顯示加上 inline 識別符號。或者不加

在類中宣告的成員函式,如果沒加inline。則在類外定義該成員函式時加了inline,該成員函式也為行內函數。

綜上所述:不管是宣告還是定義,只要看見有 inline ,都為內聯

12樓:

可以的,區別是類中您給出了函式體,不但是進行了宣告,而且進行了定義,且這個建構函式是內聯的(inline)。內聯可以讓**執行效率更高,但只限於函式體中**較簡單才適合用內聯,通常區分就看你用不用if,case,while這些控制流,用的話最好還是別直接在類中定義,即:別使用內聯。

如果函式有反函式,它一定是單調函式嗎

邵素潔伏全 如果一個函式有反函式,而且這個函式在一個區間上是連續的 直觀地說它的影象是一條連續不斷的曲線 那麼這個函式在這個區間上必定是嚴格單調的。證明它要用一點點高等數學的知識,不過直觀地想想,畫個圖,還是很容易看出來的。但如果沒有 連續 這個關鍵條件,這句話就是錯的了。舉個例子吧 函式f x 滿...

函式的駐點一定是極值點對嗎?原因是什麼

極值點的存在範圍情況有兩種 1 駐點,2 導數不存在,但在該點連續的點 判斷方法有兩種 1 該點臨近的左右側的導數的符號不同 2,該點二階導數的符號 駐點和極值點的關係 1 駐點不一定是極值點,極值點也不一定是駐點 2 導函式的極值點是駐點。說下我對駐點的意義理解 有助於形象化理解 駐點是函式導數為...

導數有界,函式一定有界嗎函式f可導

茹翊神諭者 如果i是有限區間,則原命題成立 q1292335420我 對每一 x0 a,b 對任意 0,取 l 0,則任給 x a,b x x0 由假設,有 f x f x0 l x x0 l 據連續的定義,可知f x 在 a,b 上連續.其次,由條件f a f b 0,利用閉區間上連續函式的介值定...