C 函式探幽

2022-08-26 12:12:08 字數 1695 閱讀 6891

內聯函式:

工作原理:

將一些短小的函式, 宣告為inline型別, 編譯器在編譯時,會直接替換函式呼叫處的**

為什麼會有內聯函式:

在程式執行時, 如果呼叫了函式, 會經歷以下步驟:

1. 拷貝引數,記憶體中跳轉到當前函式的機器碼內,複製引數, 執行**

2. 將函式的返回值放在cpu暫存器或某個記憶體位址中

3. 回到被呼叫的**處,取出返回值

可以看到 ,乙個函式呼叫會經歷很多步驟, 這些步驟也會加大記憶體開銷,降低程式執行效率。

但是有些函式的復用性很高, 寫成函式用來呼叫, 會減少**量, 所以就出現了內聯函式

直接替換**行,減少了來回跳轉的過程

但是也不是每個函式都要寫成內聯函式的

內聯函式只建議一些**量小, 復用性高的函式使用。

引用變數:

使用引用作為函式的引數時,應盡量使用const 修飾符, 原因如下:

1. 防止**無意中修改資料的值

2. const 形參可以同時接收const 和非const 引數,而非const形參,只能接受非const 引數

3. const 引用使函式能夠正確生成並使用臨時變數。

當引數型別和函式型別不匹配時,如果你意圖是修改實參, 那麼c++ 預設的機制會阻止這種行為

假如引數不匹配, c++ 會生成乙個臨時的型別正確的變數, 並將型別不匹配的實參,強制轉換為 和形參對應型別的變數

此時, 函式中的引用形參就會指向新的臨時變數, 所以不會修改實參的值。

將引用作為返回值時需要注意的事項:

為何要將引用作為返回值:

函式結束時,會將返回值複製到暫存器或者記憶體中某個位置上,如果這個值只是乙個int等基本型別,這樣沒什麼影響

但是如果返回乙個非常大的資料,那麼複製返回值的這一步, 會降低程式的執行效率

但是如果此時返回乙個引用, 那麼這個引用最大的長度也不過是記憶體的大小,會提公升程式的效率

但是需要注意的, 返回的引用不能是函式中生成的臨時變數(區域性變數)

因為區域性變數在函式執行結束後就會被釋放,此時如果直接訪問返回值, 會導致程式訪問空引用, 進而崩潰

應當返回函式引數列表中的應用, 因為這個引用是在函式呼叫之前就已經指向的記憶體, 在函式執行結束之後返回值 也能訪問的到。

將引用用於類物件需要注意的事項:

物件,繼承,和引用:

ofstream 和 ostream類:

這兩個類是繼承關係,ofstream繼承於ostream

因為這兩個類可以進行強制型別轉換

所以ostream & 的引用可以指向 ofstream 物件

總計, 合適使用引用作為引數:

一、只是傳遞值,而不修改值:

1,如果資料物件很小, 比如內建的基本資料型別, 按值傳遞

2,如果資料物件是陣列 , 則按指標傳遞, 因為這是唯一的選擇,因為不修改值,所以要在函式宣告中加入const

3,如果資料物件是較大的結構,則按const 引用或const指標傳遞, 提高程式執行效率, 節省複製資料物件所需的時間

4,如果資料物件是類物件, 則使用const 引用, 類設計的語義常常要求使用引用, 這是c++新增這項特性的主要原因, 也是標準方式。

二、修改呼叫的引數

1,如果是內建資料型別, 使用指標

2,如果是陣列,則只能使用指標

3,如果是結構,使用指標或引用。

4,如果是物件,則使用引用。

c 函式探幽

inline double square double x int rats 1,next 2 int rodents rats rodents next 賦值操作而已必須在宣告引用變數時進行初始化。一旦與某個變數關聯,將不能改變關聯關係。void swap int a,int b const fr...

C 學習(八) 函式探幽

內聯函式呼叫時無需跳到另乙個位置執行 而是直接將 塊替換到呼叫位置,因此執行速度更快。但代價是占用了更多的記憶體。在呼叫次數多,函式比較小時適用 要使用這項特性,必須採取下列措施 在函式宣告前加上關鍵字inline 在函式定義前加上關鍵字inline include an inline functi...

c primer 函式探幽

1.內聯函式 正常呼叫函式的時候,指標跳到函式所在的位置,執行完之後返回到呼叫該函式的記憶體處。內聯函式的編譯 與其他程式內聯起來,執行的時候無需跳到另乙個位置處,但是會犧牲記憶體。如果 執行時間短,則內聯呼叫就可以省去非內聯呼叫使用的大部分時間 如果函式經常被呼叫,也可以使用內聯 內聯函式不能遞迴...