日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

关于c中的inline

發布時間:2025/4/5 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于c中的inline 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在c中,為了解決一些頻繁調用的小函數大量消耗棧空間或是叫棧內存的問題,特別的引入了inline修飾符,表示為內聯函數。
棧空間就是指放置程式的局部數據也就是函數內數據的內存空間,在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足所造成的程式出錯的問題,函數的死循環遞歸調用的最終結果就是導致棧內存空間枯竭。
下面我們來看一個例子

#include <stdio.h>
//函數定義為inline即:內聯函數
inline char* dbtest(int a) {
? ? return (a?% 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,否則就認為不是內聯的.


為了方便,將內聯函數直接聲明時就定義,放在頭文件中.這樣其它文件包含了該頭文件,就在每個文件都出現了內聯函數的定義.就可以內聯了.
————————————————
版權聲明:本文為CSDN博主「lufeiop02」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lufeiop02/article/details/6526499

總結

以上是生活随笔為你收集整理的关于c中的inline的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。