【问题标题】:forcing inline functions in gcc with std=c99使用 std=c99 在 gcc 中强制内联函数
【发布时间】:2015-08-04 00:11:00
【问题描述】:

我正在编写纯 c 代码(为了快速性能),我希望 gcc 至少可以扩展我声明为“静态内联”的所有函数(因为我使用的是 std=c99,内联的语义有更改和静态内联是首选),其中一些功能包括矩阵操作,堆向上/向下筛选等。通常发生很多次的相当小的操作。有没有办法通过指定 GCC 的任何选项来实现这一点?我已经启用了-o3,并且在某个地方我遇到过,通过-o3 和“静态内联”函数声明,所有函数调用都将被扩展。真的吗?我该如何验证呢?谢谢!

【问题讨论】:

  • 这听起来像是货物崇拜编程。内联函数并不一定意味着程序执行总是更快,考虑到扩展程序的大小会增加缓存未命中或页面错误的风险,并且忽略现代缓存和流水线的影响。我建议你分析你的代码以确保内联是绝对必要的。
  • 此外,其他语言(如 C++)并没有太多固有的特性,它们必然总是比“纯 C”慢。如果您真的关心性能,请使用程序集。
  • 感谢您的建议,但您没有解决我的问题...如果您有答案,请告诉我。
  • @Dai:有些嵌入式系统仍然没有缓存或 MMU。例如,大多数 ARM Cortex-M(所有 M0/+、M3 和大多数 M4)。实际上,这些是绝大多数 CPU。 (不适用于较小的 8 位和 16 位 CPU)。对于缓存/页面未命中:如果没有内联函数,这可能会成为更大的问题。
  • 语义没有改变,因为C90没有inline函数。

标签: c gcc inline


【解决方案1】:

你可以试试__attribute__((always_inline)),但一般来说,普通的inline 就足够了,除非你选择-Os。如果函数没有内联,gcc 可能有充分的理由不这样做。

更好的方法是使用分析和链接时间优化 (LTO)。一般来说,手动优化代码应该是最后的手段。

当然你可以验证一个函数是否被内联:看看生成的代码就行了。

【讨论】:

  • 我不想使用“in code”装饰器,但如果可能的话,我会寻找 gcc 选项。谢谢!
  • 我非常确定您不想在代码中内联 每个 函数,使其成为一个巨大的函数。内联只对在时间关键循环中调用的函数有意义。内联其他函数只是废话。
  • 谁说我要内联every函数?
  • 你做了:“有没有办法通过指定 GCC 的任何选项来实现这一点”和“......但正在寻找一个 gcc 选项......”。哦,您不知道命令行选项确实适用于所有编译单元吗?你认为 gcc 如何区分哪些是内联的,哪些不是内联的? (是的,单个函数有点太多了;你需要 LTO 来实现)
  • 也许我的想法是错误的......我认为“内联”只是对编译器的一个建议,我现在想要做的是强制那些用“内联”声明的函数将是由 gcc 扩展...我认为可以通过指定 -o3 来实现,但我在这里要求得到确认,希望有人能指出我验证它的方法。
猜你喜欢
  • 2015-05-20
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2020-11-28
  • 1970-01-01
相关资源
最近更新 更多