[問題] static inline的使用時機
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
Linux + gcc 5.3.1 (-std=gnu11)
問題(Question):
正在寫關於inline的文章。
inline在C99/C11中可以有以下用法:
inline:看得到此函式的一律用inline(編譯器許可的話),看不到者不能用該函式
函式無對應的位址可供呼叫
除非該函式另外有同名的非inline版本
extern inline:
看得到此函式的一律用inline(編譯器許可的話),看不到者可用函式呼叫。
有對應的位址
static inline我就不懂了。
反正inline不能外部呼叫,為啥要多一個static?
使用的時機是什麼?
感謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 90.41.66.248
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1465931381.A.BCD.html
推
06/15 03:13, , 1F
06/15 03:13, 1F
→
06/15 03:13, , 2F
06/15 03:13, 2F
→
06/15 03:14, , 3F
06/15 03:14, 3F
→
06/15 03:15, , 4F
06/15 03:15, 4F
→
06/15 03:15, , 5F
06/15 03:15, 5F
→
06/15 03:16, , 6F
06/15 03:16, 6F
→
06/15 03:16, , 7F
06/15 03:16, 7F
→
06/15 03:17, , 8F
06/15 03:17, 8F
→
06/15 03:17, , 9F
06/15 03:17, 9F
所以說當inline沒被compiler接受的時候....
inline -> 變成普通函式 -> 外部可用extern呼叫
static inline -> 變成普通static函式 -> 外部不可用extern
extern inline -> 變成普通函式 -> 外部可用extern呼叫
當inline被compiler接受時:
inline -> 變成inline -> 外部不可用extern
static inline -> 變成inline -> 外部不可用extern
extern inline -> 變成inline+普通函式 -> 外部可用extern呼叫
請問我的理解有錯嗎?
其實我覺得以現在的compiler的強度根本可以自己決定要不要inline...
這功能變得有點雞肋....
※ 編輯: wtchen (90.41.66.248), 06/15/2016 04:20:50
推
06/15 17:26, , 10F
06/15 17:26, 10F
→
06/15 17:29, , 11F
06/15 17:29, 11F
→
06/15 17:29, , 12F
06/15 17:29, 12F
→
06/15 17:30, , 13F
06/15 17:30, 13F
→
06/15 17:30, , 14F
06/15 17:30, 14F
→
06/15 17:32, , 15F
06/15 17:32, 15F
→
06/15 17:33, , 16F
06/15 17:33, 16F
推
06/15 17:40, , 17F
06/15 17:40, 17F
→
06/15 17:42, , 18F
06/15 17:42, 18F
→
06/15 17:42, , 19F
06/15 17:42, 19F
關於inline的定義在Standard 是6.7.4,不過他的寫法我不是很理解。
所以大部份我是參考 http://www.greenend.org.uk/rjk/tech/inline.html
這邊有一段是這樣:
A function where all the declarations (including the definition)
mention inline and never extern.
There must be a definition in the same translation unit.
The standard refers to this as an inline definition.
No stand-alone object code is emitted,
so this definition can't be called from another translation unit.
我的理解是,compiler看到inline可以自己決定他要真的inline還是維持普通函式。
inline的話,因為變成用Macro的方式代換函式,自然也沒有必要保留此函式的指標了。
至於gcc,參考https://gcc.gnu.org/onlinedocs/gcc/Inline.html
static inline的時候,如果該函式的指標從未被使用,
那該函式的assembly code就不會被產生(除非有 -fkeep-inline-functions)
但是如果是沒有static的inline(inline或extern inline),
該函式的assembly code一律會被產生。
另一個值得一提的是,
g++會自動把一些member function改成inline(就算沒加inline),
gcc則只有在有最佳化參數才會這麼做。
※ 編輯: wtchen (86.209.24.41), 06/15/2016 19:10:42
→
06/16 14:30, , 20F
06/16 14:30, 20F
→
06/16 15:41, , 21F
06/16 15:41, 21F
→
06/16 15:42, , 22F
06/16 15:42, 22F
→
06/16 15:46, , 23F
06/16 15:46, 23F
→
06/16 16:32, , 24F
06/16 16:32, 24F
→
06/16 22:17, , 25F
06/16 22:17, 25F
→
06/16 22:18, , 26F
06/16 22:18, 26F
→
06/16 23:13, , 27F
06/16 23:13, 27F
→
06/16 23:16, , 28F
06/16 23:16, 28F
→
06/16 23:20, , 29F
06/16 23:20, 29F
→
06/16 23:23, , 30F
06/16 23:23, 30F
→
06/16 23:23, , 31F
06/16 23:23, 31F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章