C語言之static inline函數

今天在前輩的代碼中看到在頭文件中定義了static line函數,並且該函數只是判斷一個全局變量的狀態。

內聯代碼

//abc.c中定義了一個全局變量
uint8_t g_addrMode;

//abc.h中定義static line函數
extern uint8_t g_addrMode;
static inline bool CheckAddrMode(void)
{
	return (g_addrMode != 0);
}

引入內聯函數的目的

爲了減少因函數調用而引起的系統開銷
內聯函數實際上是以空間換效率的一種做法。
以下面的例子爲例,如果main函數調用100次myprint( ),那麼會產生100次入棧和出棧操作,但實際上
myprint()只需要完成簡單的功能。

void main()
{
    int i;
    for(i=0;i<100;i++)
    {
        myprint();
    }
}
void myprint()
{
    printf("ok");
}

使用內聯函數的方式,可以寫成如下形式

void main()
{
    int i;
    for(i=0;i<100;i++)
    {
        myprint();
    }
}
static inline void myprint()
{
    printf("ok");
}

此時,等價於如下。如此,告訴編譯器把函數代碼在編譯時直接拷貝到程序中,而不是進行函數調用操作。

void main()
{
    int i;
    for(i=0;i<100;i++)
    {
        printf("ok");
    }
}

注意事項

inline關鍵字

  • 他可以向編譯器申請, 將使用inline修飾的函數內容, 內聯到函數調用的位置。如上述的printf(“ok”)直接內聯到main函數中。
  • 只能對較小的函數起作用。內部不能有for循環之類的操作。

使用static的原因

函數在運行過程中也會分配內存, 但是由於static的存在, 因此就和修飾變量類似, 他只會開闢一塊內存空間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章