當前位置:首頁 » 編程軟體 » 編譯器默認構造函數內聯

編譯器默認構造函數內聯

發布時間: 2025-09-16 18:30:40

⑴ 內聯函數

    c++從c中繼承的一個重要特徵就是效率。假如c++的效率明顯低於c的效率,那麼就會有很大的一批程序員不去使用c++了。
    在c中我們經常把一些短並且執行頻繁的計算寫成宏,而不是函數,這樣做的理由是為了執行效率,宏可以避免函數調用的開銷,這些都有預處理來完成。
    但是在c++出現之後,使用預處理宏會出現兩個問題:

    為了保持預處理宏的效率又增加安全性,而且還能像一般成員函數那樣可以在類里訪問自如,c++引入了內聯函數(inline function).
    內聯函數為了繼承宏函數的效率,沒有函數調用時開銷,然後又可以像普通函數那樣,可以進行參數,返回值類型的安全檢查,又可以作為成員函數。

    預處理器宏存在問題的關鍵是我們可能認為預處理器的行為和編譯器的行為是一樣的。當然也是由於宏函數調用和函數調用在外表看起來是一樣的,因為也容易被混淆。但是其中也會有一些微妙的問題出現:
問題1

問題2:

問題3:
    預定義宏函數沒有作用域概念,無法作為一個類的成員函數,也就是說預定義宏沒有辦法表示類的范圍。

    在c++中,預定義宏的概念是用內聯函數來實現的,而內聯函數本身也是一個真正的函數。內聯函數具有普通函數的所有行為。唯一不同之處在於內聯函數會在適當的地方像預定義宏一樣展開,所以不需要函數調用的開銷。因此應該不使用宏,使用內聯函數。

    內聯函數的確佔用空間,但是內聯函數相對於普通函數的優勢只是省去了函數調用時候的壓棧,跳轉,返回的開銷。我們可以理解為內聯函數是以 空間換時間

    為了定義內聯函數,通常必須在函數定義前面放一個inline關鍵字。但是在類內部定義內聯函數時並不是必須的。任何在類內部定義的函數自動成為內聯函數。

     構造函數Person,成員函數PrintPerson在類的內部定義,自動成為內聯函數,當然也並不是所有的函數都是內聯函數,因為編譯器會根據函數的復雜度來決定是否要把函數當作內聯函數。

    內聯函數並不是何時何地都有效,為了理解內聯函數何時有效,應該要知道編譯器碰到內聯函數會怎麼處理?
    對於任何類型的函數,編譯器會將函數類型(包括函數名字,參數類型,返回值類型)放入到符號表中。同樣,當編譯器看到內聯函數,並且對內聯函數體進行分析沒有發現錯誤時,也會將內聯函數放入符號表。
    當調用一個內聯函數的時候,編譯器首先確保傳入參數類型是正確匹配的,或者如果類型不正完全匹配,但是可以將其轉換為正確類型,並且返回值在目標表達式里匹配正確類型,或者可以轉換為目標類型,內聯函數就會直接替換函數調用,這就消除了函數調用的開銷。假如內聯函數是成員函數,對象this指針也會被放入合適位置。
    類型檢查和類型轉換、包括在合適位置放入對象this指針這些都是預處理器不能完成的(不能通過宏來實現)。
    但是c++內聯編譯會有一些限制,以下情況編譯器可能考慮不會將函數進行內聯編譯:

    內聯僅僅只是給編譯器一個建議,編譯器不一定會接受這種建議,如果你沒有將函數聲明為內聯函數,那麼編譯器也可能將此函數做內聯編譯。一個好的編譯器將會內聯小的、簡單的函數。

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:582
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:876
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:571
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:757
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:673
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1000
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:244
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:103
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:795
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:701