【问题标题】:static inline __attribute__((always_inline)) for a header only library?静态内联 __attribute__((always_inline)) 仅用于标头库?
【发布时间】:2021-09-27 00:22:18
【问题描述】:
static inline __attribute__((always_inline))

如果我在标头中的每个函数定义之前使用它,它会保证内联,并且未使用的函数不会出现在它所包含的翻译单元中吗?

【问题讨论】:

  • 有些函数根本不能内联——例如递归的,或者你获取地址的。不过,Clang 应该对此发出警告。
  • 但除此之外,这是一种安全的方式吗?
  • 每个函数定义中使用它是个坏主意。并非所有函数都需要内联,内联所有函数都会引入代码膨胀,可能会对性能产生负面影响
  • 让编译器决定是否内联。编译器比你聪明(在 99% 的情况下)

标签: c clang


【解决方案1】:

static inline __attribute__((always_inline)) 仅用于标头库?

不,只是static inlinestatic 以便函数可以在标头中,inline 以使编译器警告静音。否__attribute__,因为它会使库不可移植,并且会内联长函数并增加代码大小。

让用户使用他想要的内联 - -O3 将内联更多,-Os 将内联更少。

f 我在标头中的每个函数定义之前使用它会保证内联

是的。

未使用的函数不会出现在它所包含的翻译单元中吗?

他们将在翻译单元中。它们是在该翻译单元中定义的。

未使用的static 函数不会包含在编译该翻译单元的结果目标代码中。这与使用__attribute__((always_inline)) 无关。

【讨论】:

    【解决方案2】:

    一般来说,不能保证函数会被内联。 inline 关键字只是对编译器的提示。

    来自 Clang 参考 (always_inline):

    内联启发式被禁用,无论优化级别如何,总是尝试内联。

    不保证实际发生内联替换。

    参考文献

    【讨论】:

      猜你喜欢
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多