【发布时间】:2012-01-12 22:56:42
【问题描述】:
__attribute__((always_inline)) 是否强制一个函数被 gcc 内联?
【问题讨论】:
-
GCC 使用代码大小作为启发式来确定是否内联。我有一个网络/序列化库,由于代码大小,默认情况下它不会内联函数。我做了内联,它在基准测试中提高了 30% 的性能。内联的一个原因是,如果您在编译时知道值(传入常量)并且想要展平函数。例如,如果一个函数在两个不同的地方使用不同的静态参数,内联可以减少分支。这是用于内部循环中的函数。
-
另一个例子原因:我做音频 DSP 编码。有时我不能使用调试器,因为非内联函数调用(来自许多访问器函数和东西)变得非常昂贵,代码无法足够快地为缓冲区提供服务。
-
提醒一下……您需要同时指定
inline和__attribute__((always_inline))。我刚刚在带有 GCC 的 Android NDK r10d 上对此进行了测试。也许不是标准环境,但据我所知,这个要求对于所有平台都是相同的。 -
另一个例子(不是基于优化的):在为微控制器编写函数以在运行时写入其内部闪存时,我需要复制执行实际从闪存写入内存的例程在开始写入之前,因为不允许同时读取和写入。如果这个例程调用任何非内联函数,那么我必须将所有依赖项复制到 ram 并动态调整任何跳转地址,这比强制内联解决方案复杂得多。
-
强制内联提供了类似于 C++ 中至少部分非类型模板参数的功能:当您知道要为参数的每个值编译一个新函数时。您可以尝试使用宏来获得此功能,但强制内联通常更简洁(尽管可移植性较差)。
标签: gcc inline compiler-flags