1
在Linux中,如果我在動態庫中聲明一個函數爲__attribute__((always_inline))
,然後我動態加載該庫,那麼該函數是否將由動態鏈接程序內聯,並使用gcc
?總是內聯的函數不同.so
我編譯動態庫,在-O3
並沒有經過任何鏈接時優化標誌-flto
真正的問題是:是在一個動態庫,值得聲明的函數總是內聯,當它被稱爲大部分的時間從另一個圖書館?
在Linux中,如果我在動態庫中聲明一個函數爲__attribute__((always_inline))
,然後我動態加載該庫,那麼該函數是否將由動態鏈接程序內聯,並使用gcc
?總是內聯的函數不同.so
我編譯動態庫,在-O3
並沒有經過任何鏈接時優化標誌-flto
真正的問題是:是在一個動態庫,值得聲明的函數總是內聯,當它被稱爲大部分的時間從另一個圖書館?
glibc的動態連接器將不會內聯在它加載的對象中發現的任何功能。
但是,如果聲明並定義在頭文件中的always_inline
功能,編譯將內聯函數,即使有一個DSO的實現。這有兩個後果:
您可以獲得內聯的速度優勢。
所有的函數定義的信息已經被編譯進調用者,所以它可能不再有可能與不同的實現來替換DSO。
換句話說,它可能要快一點,但是提供ABI兼容性突然難得多。
因此,無論這是值得做的事情真的取決於性能需求和什麼樣的給你希望圖書館未來的變化。
的感謝!理想情況下,我應該並且會轉向靜態地鏈接整個項目,但不幸的是,目前這不是一件容易的事情。 我沒有得到任何動態庫的好處,併爲它付出代價。 –