內聯函式:
工作原理:
將一些短小的函式, 宣告為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.內聯函式 正常呼叫函式的時候,指標跳到函式所在的位置,執行完之後返回到呼叫該函式的記憶體處。內聯函式的編譯 與其他程式內聯起來,執行的時候無需跳到另乙個位置處,但是會犧牲記憶體。如果 執行時間短,則內聯呼叫就可以省去非內聯呼叫使用的大部分時間 如果函式經常被呼叫,也可以使用內聯 內聯函式不能遞迴...