c - 在Linux内核中内联使用类型限定符的时机

标签 c linux

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/

    相关文章:

    python - 检查非 root 用户是否可以访问路径

    windows - Oracle 的 NCHR() 函数在不同平台上表现不同。怎么修?

    c++ - 如何将套接字动态绑定(bind)到一个网络接口(interface)?

    c - 在 C11 之后是否有任何 future C 标准的计划?

    c - 在 C 中使用互斥锁同步两个 pthread

    linux - connman:一次自动连接到多个以太网接口(interface)

    linux - 使用 lex 和 yacc

    linux - TCP SYN/SYN ACK 的 IP header 中的 Dscp 值

    c - 在不使用乘法的情况下获取数字的阶乘

    c - int q = {1,2};特殊的初始化列表