關於C++中的內嵌函式(inline)

來源:互聯網
上載者:User

 在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的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.