關於c中的inline

來源:互聯網
上載者:User

標籤:

在c中,為瞭解決一些頻繁調用的小函數大量消耗棧空間或是叫棧記憶體的問題,特別的引入了inline修飾符,表示為內嵌函式。棧空間就是指放置程式的局部資料也就是函數內資料的記憶體空間,在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足所造成的程式出錯的問題,函數的死迴圈遞迴調用的最終結果就是導致棧記憶體空間枯竭。下面我們來看一個例子[c-sharp] view plaincopy  #include <stdio.h>   //函數定義為inline即:內嵌函式   inline char* dbtest(int a) {       return (i % 2 > 0) ? "奇" : "偶";   }       int main()   {      int i = 0;      for (i=1; i < 100; i++) {          printf("i:%d    奇偶性:%s /n", i, dbtest(i));             }   }    上面的例子就是標準的內嵌函式的用法,使用inline修飾帶來的好處我們表面看不出來,其實在內部的工作就是在每個for迴圈的內部任何調用dbtest(i)的地方都換成了(i%2>0)?"奇":"偶"這樣就避免了頻繁調用函數對棧記憶體重複開闢所帶來的消耗。inline的使用是有所限制的,inline只適合涵數體內代碼簡單的涵數使用,不能包含複雜的結構控制語句例如while、switch,並且不能內嵌函式本身不能是直接遞迴函式(自己內部還調用自己的函數)。補充:inline函數僅僅是一個建議,對編譯器的建議,所以最後能否真正內聯,看編譯器的意思,它如果認為函數不複雜,能在調用點展開,就會真正內聯,並不是說聲明了內聯就會內聯,聲明內聯只是一個建議而已. 其次,因為內嵌函式要在調用點展開,所以編譯器必須隨處可見內嵌函式的定義,要不然,就成了非內嵌函式的調用了.所以,這要求每個調用了內嵌函式的檔案都出現了該內嵌函式的定義。因此,將內嵌函式放在標頭檔裡實現是合適的,省卻你為每個檔案實現一次的麻煩.而所以聲明跟定義要一致,其實是指,如果在每個檔案裡都實現一次該內嵌函式的話,那麼,最好保證每個定義都是一樣的,否則,將會引起未定義的行為,即是說,如果不是每個檔案裡的定義都一樣,那麼,編譯器展開的是哪一個,那要看具體的編譯器而定.所以,最好將內嵌函式定義放在標頭檔中. 而類中的成員函數預設都是內聯的,如果在類定義時就在類內給出函數,那當然最好.如果在類中未給出成員函數定義,而又想內聯該函數的話,那在類外要加上inline,否則就認為不是內聯的.為了方便,將內嵌函式直接聲明時就定義,放在標頭檔中.這樣其它檔案包含了該標頭檔,就在每個檔案都出現了內嵌函式的定義.就可以內聯了.

 

關於c中的inline

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.