內聯函式與巨集定義

2021-04-25 12:22:16 字數 2266 閱讀 8760

用內聯取代巨集: 1.內聯可除錯; 2.可進行型別安全檢查或自動型別轉換; 3.可訪問成員變數。 另外,定義在類宣告中的成員函式自動轉化為內聯函式。

內聯函式與巨集定義

在c中,常用預處理語句#define來代替乙個函式定義。例如:

#define max(a,b) ((a)>(b)?(a):(b))

該語句使得程式中每個出現max(a,b)函式呼叫的地方都被巨集定義中後面的表示式((a)>(b)?(a):(b))所替換。

巨集定義語句的書寫格式有過分的講究, max與括號之間不能有空格,所有的引數都要

放在括號裡。儘管如此,它還是有麻煩:

int a=1,b=0;

max(a++,b); //a被增值2次

max(a++,b+10); //a被增值1次

max(a,"hello"); //錯誤地比較int和字串,沒有引數型別檢查

max( )函式的求值會由於兩個引數值的大小不同而產生不同的***。

max(a++,b)的值為2,同時a的值為3;

max(a++,b+10)的值為10,同時a的值為2。

如果是普通函式,則max(a,"hello")會受到函式呼叫的檢查,但此處不會因為兩個引數型別不同而被編譯拒之門外。幸運的是,通過乙個內聯函式可以得到所有巨集的替換效能和 所有可預見的狀態以及常規函式的型別檢查:

inline int max(int a,int b)

1.內聯函式與巨集的區別:

傳統的巨集定義函式可能會引起一些麻煩。

ex:#define f(x) x+x

void main()

這裡x將被加兩次。

內聯函式被編譯器自動的用函式的形勢新增進**,而不會出現這種情況。

內聯函式的使用提高了效率(省去了很多函式呼叫彙編**如:call和ret等)。

2.內聯函式的使用:

所有在類的宣告中定義的函式將被自動認為是內聯函式。

class a()

void c();// not a inline function;

void d()

如果想將乙個全域性函式定義為內聯函式可用,inline 關鍵字。

inline a()

注意:在內聯函式中如果有複雜操作將不被內聯。如:迴圈和遞迴呼叫。

總結:將簡單短小的函式定義為內聯函式將會提高效率。

1.對於乙個頻繁使用的短小函式,在c語言中應用什麼實現,在c++中應用什麼實現?

c用巨集定義,c++用inline

內聯函式

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

函式是一種更高階的抽象。它的引入使得程式設計者只關心函式的功能和使用方法,而不必關心函式功能的具體實現;函式的引入可以減少程式的目標**,實現程式**和資料的共享。但是,函式呼叫也會帶來降低效率的問題,因為呼叫函式實際上將程式執行順序轉移到函式所存放在記憶體中某個位址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。這種轉移操作要求在轉去前要保護現場並記憶執行的位址,轉回後先要恢復現場,並按原來儲存位址繼續執行。因此,函式呼叫要有一定的時間和空間方面的開銷,於是將影響其效率。特別是對於一些函式體**不是很大,但又頻繁地被呼叫的函式來講,解決其效率問題更為重要。引入內聯函式實際上就是為了解決這一問題。

在程式編譯時,編譯器將程式中出現的內聯函式的呼叫表示式用內聯函式的函式體來進行替換。顯然,這種做法不會產生轉去轉回的問題,但是由於在編譯時將函式休中的**被替代到程式中,因此會增加目標程式**量,進而增加空間開銷,而在時間代銷上不象函式呼叫時那麼大,可見它是以目標**的增加為代價來換取時間的節省。

內聯函式的定義方法

定義內聯函式的方法很簡單,只要在函式定義的頭前加上關鍵字inline即可。內聯函式的定義方法與一般函式一樣。如:

inline int add_int (int x, int y, int z)

在程式中,呼叫其函式時,該函式在編譯時被替代,而不是像一般函式那樣是在執行時被呼叫。

使用內聯函式應注意的事項

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

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

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

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

文章出處:http://www.diybl.com/course/3_program/c++/cppsl/2008111/96237.html

內聯函式與巨集定義

1 內聯函式取消了引數的壓棧,減少呼叫的開銷 2 內聯函式宣告必須和定義一起,如果只有宣告,編譯器只會將它看做普通函式的宣告,如果宣告的時候使用inline,定義在其他地方也用inline,那麼它是內聯還是普通函式 普通函式。查彙編 內聯函式與普通函式一樣?3 c 類中定義的函式都預設是內聯函式,無...

巨集定義與內聯函式

1 巨集定義的規則和使用解析 1 巨集定義的解析規則就是 在預處理階段由預處理器進行替換,這個替換是原封不動的替換。2 巨集定義替換會遞迴進行,直到替換出來的值本身不再是乙個巨集為止。3 乙個正確的巨集定義式子本身分為3部分 第一部分是 dedine 第二部分是巨集名 剩下的所有為第三部分。4 巨集...

內聯函式與巨集定義

一 巨集定義和內聯函式的區別 1.巨集定義不是函式,但是使用起來像函式。預處理器用複製巨集 的方式代替函式的呼叫,省去了函式壓棧退棧過程,提高了效率。內聯函式本質上是乙個函式,內聯函式一般用於函式體的 比較簡單的函式,不能包含複雜的控制語句,while switch,並且內聯函式本身不能直接呼叫自身...