-
讓我們從巨集和函式之間的區別開始:
巨集做簡單的字串替換(注意是字串替換,不是其他型別的引數替換),而函式引數是傳遞的,引數是資料型別,可以是多種型別。
巨集的引數替換直接處理,無需計算,而函式呼叫則將引數的值傳遞給形式引數,因為說它是乙個值,所以自然是計算出來的。
巨集是在編譯之前編譯的,即它們用巨集體替換巨集名稱然後編譯,而函式顯然是在編譯後和執行時呼叫的。 因此,巨集占用編譯時間,而函式在執行時需要時間。
巨集引數不占用記憶體空間,因為它們只是替換字串,而呼叫函式時的引數傳遞是特定變數之間的資訊傳遞,而表單引數作為函式的區域性變數,顯然占用了記憶體。
函式的呼叫需要支付一定的時間和空間開銷,因為系統在呼叫函式時,必須保留場景,然後轉移到被呼叫的函式執行,呼叫後再返回主函式,然後恢復場景,這些操作顯然在巨集中是不可用的。
現在讓我們看一下內聯函式:
所謂"內聯函式"這將是乙個非常簡單的函式"內嵌"在呼叫他的程式的過程中,這樣做的目的是為了避免上面提到的第 5 點,目的是為了節省原來函式呼叫的時空開銷。 但是必須注意的是,作為內聯函式,函式體必須非常簡單,不能包含迴圈、條件、選擇等複雜結構,否則不能作為內聯函式使用。
事實上,即使你沒有將函式指定為內聯函式,一些編譯系統也會自動將非常簡單的函式視為內聯函式; 對於複雜的函式,即使將它們指定為內聯,系統也不會打擾它們。
有點多哈,呵呵,但答案比較完整!
-
巨集的作用是簡單的字串替換,在編譯之前將巨集名稱替換為巨集體。 內聯函式首先是乙個函式,它傳遞引數並在編譯後執行,其次,作為乙個內聯函式,它是乙個非常簡單的函式"內嵌"呼叫他的程式**來減少一定的時空開銷。
-
C++ 中的內聯函式在巨集之上提供功能。 巨集是內聯的簡單實現。 但是,兩者之間有很大的區別。
內聯函式使用值傳遞,而巨集定義使用對等替換。 這一點非常重要,因為巨集定義使用得不好,在使用過程中很可能會犯錯。
例如,此巨集如下所示:
#define max(a, b) a>b?a:b
當我們使用這樣的巨集時,沒有問題: max( num1, num2 ); 因為巨集隨後變成了 num1>num2?num1:
num2;。但是,如果這樣稱呼,max( 17+32, 25+21); 嗯,編譯時出錯,原因是,巨集變為:17+32>25+21?
17+32:25+21,誰,這是什麼?
因此,在使用巨集時,必須新增帶括號的引數,可以將上面的示例更改為以下示例來解決問題。
#define max( (a), b) )a)>(b)?(a)b)
即便如此,這個巨集仍然存在乙個錯誤,因為如果我在遍歷這個巨集後呼叫 max(i++, j++),i 和 j 會加起來兩次,這絕不是我們想要的。 因此,在使用巨集時要謹慎,因為巨集的結果很難預測。 雖然巨集執行速度很快(因為沒有函式呼叫的開銷),但巨集會使源膨脹,使目標檔案大小更大
乙個 50 行的巨集在程式中用了 1000 個地方,巨集會很糟糕),反之,它不能使程式執行得更快(因為執行檔案變大,系統在執行時頻繁更改頁面)。因此,在決定是使用函式還是巨集時必須小心。
相似之處:兩者都處於預處理階段,**塊,替換。
-
1.內聯函式可在執行時進行除錯,而巨集定義則不能;
2.編譯器對內聯函式的引數型別執行安全檢查或自動型別轉換(如普通函式),而巨集定義則不執行;
3.內聯函式可以訪問類的成員變數,而巨集定義則不能;
4.宣告在類中同時定義的成員函式會自動轉換為內聯函式。
王子對國家負有責任,騎士有責任保護他要保護的人民。 王子英俊,才華橫溢,他可以給你榮耀和財富。 騎士帥氣,深邃,能給你安全感。 >>>More
事半功倍,就是努力少,但效果大,往往是指做事時用對的方法,付出的比別人少,但收穫比別人多! 付出一半的努力,就能收穫雙倍的效果!
1.不同的方法:軟化就是軟化頭髮,需要先洗髮水,然後塗上藥水,再塗上定型產品,最後洗淨吹乾。 拉直是指拉直頭髮的過程,首先需要洗髮,然後拉直頭髮,然後用夾板拉直頭髮,最後塗上造型藥水並吹乾。 >>>More