新手入門:關於C++中的內聯函數(inline)

2020-12-11 太平洋電腦網

正在閱讀:新手入門:關於C++中的內聯函數(inline)新手入門:關於C++中的內聯函數(inline)

2005-03-01 10:10出處:PConline作者:管寧責任編輯:xietaoming

 

  在c++中,為了解決一些頻繁調用的小函數大量消耗棧空間或者是叫棧內存的問題,特別的引入了inline修飾符,表示為內聯函數。

  可能說到這裡,很多人還不明白什麼是棧空間,其實棧空間就是指放置程序的局部數據也就是函數內數據的內存空間,在系統下,棧空間是有限的,如果頻繁大量的使用就會造成因棧空間不足所造成的程序出錯的問題,函數的死循環遞歸調用的最終結果就是導致棧內存空間枯竭。

  下面我們來看一個例子:

#include <iostream
#include <string
using namespace std; 
 
inline string dbtest(int a); //函數原形聲明為inline即:內聯函數 
 
 
void main() 

    for (int i=1;i<=10;i++) 
    { 
        cout << i << ":" << dbtest(i) << endl; 
    } 
    cin.get(); 
 

 
string dbtest(int a)//這裡不用再次inline,當然加上inline也是不會出錯的 

    return (a%2>0)?"奇":"偶"; 
 
}

  上面的例子就是標準的內聯函數的用法,使用inline修飾帶來的好處我們表面看不出來,其實在內部的工作就是在每個for循環的內部所有調用dbtest(i)的地方都換成了(i%2>0)?"奇":"偶"這樣就避免了頻繁調用函數對棧內存重複開闢所帶來的消耗。

  說到這裡很多人可能會問,既然inline這麼好,還不如把所謂的函數都聲明成inline,嗯,這個問題是要注意的,inline的使用是有所限制的,inline只適合函數體內代碼簡單的函數使用,不能包含複雜的結構控制語句例如while switch,並且不能內聯函數本身不能是直接遞歸函數(自己內部還調用自己的函數)。

  說到這裡我們不得不說一下在c語言中廣泛被使用的#define語句,是的define的確也可以做到inline的這些工作,但是define是會產生副作用的,尤其是不同類型參數所導致的錯誤,由此可見inline有更強的約束性和能夠讓編譯器檢查出更多錯誤的特性,在c++中是不推薦使用define的。

  關於內聯函數的更多例子我就不一一舉出了,靈活的使用也多靠學習者本身,我只在此拋磚引玉,讓大家儘可能多的學習到c++中的一些新的先進的特性知識點。

302 Found

302 Found

The requested resource resides temporarily under a different URI.


Powered by Tengine

相關焦點

  • C++中inline, extern, static潛在的陷阱
    相信inline, extern, static這三個關鍵字對於C++程式設計師是非常熟悉的,但有些時候,其中隱藏的陷阱,可能會給你的程序帶來一些很難診斷的問題。1. inline我們先聚焦於inline函數(內聯函數)。inline可以與名稱空間一起使用,但這種用法並不常見。
  • Kotlin 高階函數、內聯
    那我是不是可以全部都弄成內聯了?但是這樣就又有了個問題。如果你只是想內聯函數的某些 lamda  表達式被內聯,其他的不允許內聯操作的話可以使用 noinline 。那問題又來了,直接改成 noinline 的話,那不是又變成搞了一堆對象出來了?還有沒其他方法?Kotlin 還提供了一個 crossline 關鍵字。把上面的 noinline 的例子改成 crossline ,來對比下編譯後的文件從上面可以看得出,crossline  不會搞出一堆對象。
  • C++ 宏替換和內聯函數的區別
    先說基礎知識,宏替換發生在的是預編譯階段、內聯函數發生在的是運行階段。
  • 內聯函數和外聯函數有什麼區別
    內聯函數   內聯函數是指用inline關鍵字修飾的函數。在類內定義的函數被默認成內聯函數。內聯函數從原始碼層看,有函數的結構,而在編譯後,卻不具備函數的性質。   內聯函數不是在調用時發生控制轉移,而是在編譯時將函數體嵌入在每一個調用處。編譯時,類似宏替換,使用函數體替換調用處的函數名。一般在代碼中用inline修飾,但是能否形成內聯函數,需要看編譯器對該函數定義的具體處理。   內聯擴展是用來消除函數調用時的時間開銷。
  • Kotlin 中的 inline ,noinline 和 crossinline
    佛系編碼  ·  寫點編碼的日常inline  在編譯時,會將此修飾符修飾的函數複製到調用處(稱為內聯),避免創建 Function 對象,以減少創建對象的內存開銷。noinline 需要配合 inline 使用,使用在函數型參上,告訴編譯器當前這個函數不能內聯crossinline 需要配合 inline 使用,告訴編譯器不能使用 return,否則就跳出調用處函數,但是可以使用 return@label 跳出指定外層。
  • C語言關鍵字 inline 講解?一定要防止踩到這幾個屎坑!
    所以,內聯不適用下面幾個場景:1 函數實現很長。2 函數本身內部有循環體,那麼棧消耗可以忽略,就沒必要。而內聯函數有時候我們會使用宏定義來替代,但是他兩有一些區別,具體是:1 宏只是簡單的擴展,發生在預處理階段。
  • C語言陷阱與技巧第2節,使用inline函數可以提升程序效率,但是讓...
    inline 關鍵字的作用在C語言程序開發中,inline 一般用於定義函數,inline 函數也被稱作「內聯函數」,C99 和 GNU C 均支持內聯函數。那麼在C語言中,內聯函數和普通函數有什麼不同呢?
  • Kotlin最佳實踐:在高階函數中使用inline - 碼農登陸
    前言最近,無意中看到一篇文章,是聊inline在高階函數中的性能提升,說實話之前沒有認真關注過這個特性,所以藉此機會好好學習了一番。高階函數:入參中含有lambda的函數(方法)。也算是技術無國界吧,哈哈~官方文檔對inline的使用主要提供了倆種方式:內聯類、內聯函數正文操作符是我們日常Kotlin開發的利器,如果我們點進去看看源碼,我們會發現這些操作符大多都會使用inline。
  • 混合使用C、C++和彙編語之:內聯彙編和嵌入型彙編的使用
    使用它可以在C/C++程序中實現C/C++語言不能完成的一些工作。例如,在下面幾種情況中必須使用內聯彙編或嵌入型彙編。·程序中使用飽和算術運算(Saturatingarithmetic),如SSAT16和USAT16指令。·程序中需要對協處理器進行操作。
  • DSP編程技巧之9-揭開編譯器神秘面紗之鉤子函數與庫函數
    關於鉤子函數,在CCS的編譯器裡還有以下的幾個規則可以補充說明一下:  1. 使能鉤子函數選項的話,會默認使用表1中的定義方法創建鉤子函數的隱式聲明。鉤子函數可以被聲明為inline內聯類型的,此時編譯器把它們與其它的內聯函數按照相同的規則進行處理,例如函數優化等選項對它們起相同的作用。  4. 入口鉤子函數和出口鉤子函數是互相獨立的,我們可以只使用它們中的一個,或者同時使用它們。  5. 我們要避免對鉤子函數的遞歸調用,也就是說在鉤子函數中不要調用其它包含了對鉤子函數本身進行調用的函數(有點小拗口)。
  • CSS中內聯元素與塊級元素
    首頁 > 教程 > 關鍵詞 > CSS最新資訊 > 正文 CSS中內聯元素與塊級元素
  • 關於CSS屬性display:inline-block的深入理解
    但很遺憾,最流行的 IE 和 Firefox 卻不支持這個屬性(在 Firefox3 版本中將會支持 display:inline-block)。不過 Firefox 下卻有私有屬性 -moz-inline-box 和inline-block 形似,為什麼是「形似」而不是「神似」呢?
  • C/C++中的宏定是什麼?有什麼作用呢!看完茅塞頓開
    ,而不需要到程序中去尋找哪些地方使用了200。推薦下我自己的C/C++學習群:231662552,不管你是小白還是大牛,小編我都挺歡迎,不定期分享乾貨,包括我自己整理的一份2018最新的C/C++資料和零基礎入門教程,歡迎初學和進階中的小夥伴。2、防止多重包含預處理器變量:在編寫頭文件時,我們需要引入一些額外的預處理設置,預處理器允許我們自定義變量。
  • C語言與C++面試知識總結
    在以下場景中,經常需要顯式引用 this 指針:inline 內聯函數 特徵編譯器一般不內聯包含循環、遞歸、switch 等複雜操作的內聯函數;在類聲明中定義的函數,除了虛函數的其他函數都會自動隱式地當成內聯函數。
  • 現代C++之constexpr
    (1)C++11中的constexpr指定的函數返回值和參數必須要保證是字面值,而且必須只有一行return代碼,這給函數的設計者帶來了更多的限制,比如通常只能通過return 三目運算符+遞歸來計算返回的字面值。
  • 學習C/C++(14)-C++中string類的實現
    String是C++中的重要類型,程式設計師在C++面試中經常會遇到關於String的細節問題,甚至要求當場實現這個類
  • Kotlin Vocabulary | 內聯類 inline class
    有參構造函數是私有的,第二個構造函數的名字中包含了一個 "-",其在 Java 中為無效字符。這意味著無法從 Java 實例化內聯類。為了實現此功能,Kotlin 編譯器會改寫函數的名稱,並使用內聯類作為函數參數。我們已經講過,不能在 Java 中實例化內聯類。那可不可以使用呢?✅ 可以將內聯類傳遞給 Java 函數我們可以將內聯類作為參數傳遞,它們將會作為對象被使用。
  • Google C++代碼規範:頭文件
    定義:前置聲明(forward declaration)是類、函數和模板的純粹聲明,沒伴隨著其定義。優點:節省編譯時間。缺點:隱藏依賴關係,依賴升級可能會不兼容甚至引入某些 BUG。例如對函數進行聲明,後來加了一個參數,就會導致找不到函數。如果對類進行聲明,類進行調整時,甚至可能導致類的內存錯誤。
  • 【Matlab基礎】 自定義函數
    關於形參(形式參數)和實參(實際參數):函數定義中的參數就是形參,只是用來限定函數所接收的數據類型的,「泛指該數據類型下任一元素」;函數調用中的參數就是實參,是「特指的具體數值」來代入函數體執行代碼。例如(C語言):其中,x,y是形參,2, 3,a, b是實參。
  • 五萬字長文:C/C++ 面試知識總結
    在以下場景中,經常需要顯式引用 this 指針:為實現對象的鏈式引用;為避免對同一對象進行賦值操作;在實現一些數據結構時,如 `list`。inline 內聯函數特徵使用inline int functionName(int first, int secend,...)