內聯函數(inline)
內聯函數對於一般的人來說,沒什麼可講的,就那麼回事(反正就有那種說不清的感覺)。有這種想法的人似乎和我一樣都是菜鳥級別的吧!
今天看到一個面試題:
講一下內聯函數的含義:(面試題)
將以下代碼改爲C語言代碼,要求在.c文件中能編譯通過(要提交.c文件)
/*
將以下代碼改爲C語言代碼,要求在.c文件中能編譯通過(要提交.c文件)
*/
#include<iostream>
using namespace std;
inline float max(float c1, float c2)
{
return c1 > c2 ? c1 : c2;
}
int main()
{
cout << "請輸入2個浮點數:";
float c1 = 0.0f;
float c2 = 0.0f;
cin >> c1 >> c2;
cout << max(c1, c2) << endl;
return 0;
}
呃呃這要怎麼講???從哪裏講,腦子裏有東西,但是說不清。(在我這裏說不清就是不會)
因此再一次學習inline函數,到網上查資料,有收穫。
【參考:內聯函數維基百科】
在計算機科學中,內聯函數(有時稱作在線函數或編譯時期展開函數)是一種編程語言結構,用來建議編譯器對一些特殊函數進行內聯擴展(有時稱作在線擴展);也就是說建議編譯器將指定的函數體插入並取代每一處調用該函數的地方(上下文),從而節省了每次調用函數帶來的額外時間開支。但在選擇使用內聯函數時,必須在程序佔用空間和程序執行效率之間進行權衡,因爲過多的比較複雜的函數進行內聯擴展將帶來很大的存儲資源開支。
接下來就從維基百科的定義中找到答案。
1)內聯函數(有時稱作在線函數或編譯時期展開函數)
這句話的信息量非常大,首先內聯函數就是編譯時期展開函數。(他說出了內聯函數的作用時機,以及他的作用形式)
作用時機---------------------------------編譯時。
作用形式--------------------------------展開函數(將函數展開)。
注意:編譯原理
創建一個可執行的目標程序:一般分爲經歷一下4個過程。
2)也就是說建議編譯器將指定的函數體插入並取代每一處調用該函數的地方
內聯實質--------------------------------函數替換。
注意:
建議-------------------------------------雖然程序員將函數申請爲Inline函數,但是是否真正成爲inline函數,不一定。
函數體----------------------------------上面提到的是將函數體插入到調用該函數的地方,是函數體,體體體,重要的事情說三遍。
3)c++引入內聯函數的目的
節省了每次調用函數帶來的額外時間開支。
4)儘量用inline、const、enum替換 #define
儘量用編譯器替換預處理。
a)#define宏預處理階段進行粗暴替換,不進行語法檢查,而inline函數是在編譯器階段進行的替換,接受語法,語義的檢查。相對更安全。#define 的錯誤一般很難最查到。
總結:通過以上對內聯函數(inline function)的講解,是否心中已經有了上面面試提的答案了呢。
#include<iostream>
using namespace std;
//inline float max(float c1, float c2)
//{
// return c1 > c2 ? c1 : c2;
//}
#define max(x,y) (x > y ? x : y)
int main()
{
cout << "請輸入2個浮點數:";
float c1 = 0.0f;
float c2 = 0.0f;
cin >> c1 >> c2;
cout << max(c1, c2) << endl;
return 0;
}