RISC-V GCC下使用inline

目前在做性能優化,就是在最短的時間內能跑完一個完整的神經網絡,因此對代碼的執行時間比較敏感。今天發現在頭文件中定義的static inline函數,編譯之後在兩個源文件中分別定義了static函數,並沒有實現inline該有的功能。甚至比普通的函數還差,因爲同樣的代碼拷貝了兩份,代碼段變大了。於是考慮把static去掉看看,發現直接報告"undefined reference"。爲了排除多文件使用的影響,寫了一個inline測試函數do_something(),直接僅僅在一個c源文件(test.c)中定義和使用。
函數使用:

void func_b(void)
{
    do_something();
}

測試1:

inline void do_something() 
{
    xxx;
}

測試結果:編譯報錯"undefined reference to do_something"

測試2:

增加static:

static inline void do_something()
{
    xxx;
}

測試結果:編譯通過,但是do_something()跟普通函數一樣使用。並沒有實現inline的功能。

測試3:

去掉static,添加聲明:

void do_something()//前面加不加extern都一樣。
inline void do_something()
{
    xxx;
}

測試結果:編譯通過,但是do_something()跟普通函數一樣使用。並沒有實現inline的功能。

測試4:

網上有些人說gcc使用__inline, 所以咱也使用__inline代替inline試試看。
測試結果:跟使用inline的效果一樣。

測試5:

目前使用了最高的優化選項,對該部分定義和使用inline函數的代碼取消優化。
測試結果:跟不取消優化的效果一樣。

測試6:

使用__attribute__這個方法是搜freertos的源碼發現的。

/*static*/ __attribute__()(always_inline) inline void do_something()
{
    xxx;
}

測試結果:鏈接通過,達到了inline的功能。在c源文件中定義時,是否使用static都能實現inline的直接替換功能。不過又不是函數,用static沒啥用啊。
把inline函數放到頭文件中,可以多個源文件調用,都能實現inline的直接替換功能。

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