Linux内核开发人员在Linux内核中大量使用inline
类型限定符。
如果使用得当,它可以减少函数调用的成本。
如果不好,它可能会太大地放大图像大小,这会增加访问内存的成本。
他们如何判断何时使用inline
类型限定符?
最佳答案
inline
具有什么作用的详细信息特定于编译器。特定于编译器的扩展(例如__attribute__((always_inline))
或__forceinline
)可能会更有用,因为它们具有更强大且更可预测的效果。
例如,对于Clang,如果函数的“成本”低于阈值,则该函数将内联。对于没有任何inline
属性的函数,阈值设置为225,但是对于优化级别-Os
,-O2
和-O3
,该阈值分别乘以0.333、1.500或1.667。使用inline
时,阈值设置为487。因此,在使用较低级别进行编译时,尤其是在使用-Os
(75 vs 487阈值)时,效果更加明显。您可以在https://godbolt.org上检查并尝试使用Clang的“优化输出”。
编译器不需要inline
关键字来内联函数。尽管仍然存在某些功能禁用内联的情况,除非使用inline
关键字。对于example,除非指定了-fPIC
,否则GCC在构建共享库时不会在ELF目标上内联具有“默认”可见性的函数(-fno-semantic-interposition
标志)。
最常见的建议是对代码进行“概要分析”,但是我发现它不是很有用,因为您将无法在所有函数上检查inline
关键字的所有可能组合。这一切都是有经验的:C程序员通常知道编译器生成的代码是什么样子,他们还知道最终想要获得什么代码。
当前,C语言中inline
的主要目标是:
static inline
函数(来自标题)发出警告extern inline
函数。 可以通过through LLVM parameters
-inline-threshold
和-inlinehint-threshold
操纵Clang内联。在C++中,
inline
具有其他含义-内联函数生成“弱”符号,链接程序必须删除这些符号的重复项。在某些情况下,函数被视为隐式标记为inline
,但仅在语义上标记为。进一步添加inline
关键字至少可以在Clang上增加内联阈值(从正常级别到“内联”级别)。
关于c - 在Linux内核中内联使用类型限定符的时机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60694016/