__inline函数与C中的普通函数

Abh*_*pta 4 c inline c99

我正在研究宏,并发现了许多关于宏和内联函数之间差异的来源和问题.但没有什么具体指定和区分内联与正常功能的优缺点.

但是,如果我想在正常功能和内联功能之间进行选择呢?

我知道使用内联函数会增加代码大小.但是,虽然研究规模不是主要问题,但效率是目标.使函数成为内联函数表明对函数的调用尽可能快.(由于堆栈和填充开销)

总是使用内联函数是否更好?如果不是那么为什么?使用普通函数比内联有什么好处?

在阅读其他问题时,我读到内联只是对编译器的一个暗示.编译器可能会忽略它.什么时候编译器忽略它为什么

ams*_*ams 8

内联函数可以有几个优点:

  1. 它可以使程序大小更小.当函数仅使用一次时通常就是这种情况.另请参见2.和3.

  2. 如果编译器知道变量是常量,或非NULL,或类似的东西,编译器可以消除函数的未使用位.这可以节省大小,但也可以使代码在运行时更有效.

  3. 编译器可以消除调用函数的位,甚至是其他内联函数,因为它可以看到函数对数据执行的操作.(假设代码检查返回值并调用错误函数,如果它为NULL,则可以将其排除.

  4. 它可以减少呼叫开销,但是在具有预测分支的当前处理器中,这并不像您想象的那么多.

  5. 它可以提升循环中的常量位,执行常见的子表达式消除,以及许多其他优化,以使循环代码更高效,等等.

然后有缺点:

  1. 它可以使代码更大,显然.

  2. 它可能会增加调用函数内的寄存器压力,这可能会使编译器混淆并阻止它进行优化.

  3. 拥有一个可以存在于CPU缓存中的热门功能可以比将其复制到许多并非总是缓存的地方更快.

  4. 它可能会妨碍调试.

内联函数只是一个提示的原因主要是因为C标准不要求编译器优化任何东西.如果它不是提示,则优化不是可选的.另外,仅仅因为函数标记内联不会阻止编译器内联它,如果它计算这样做是有利的.

  • 当函数未标记为内联时,关于编译器内联的最后一条评论为 +1。有关 GCC 功能的信息(例如),请参阅 http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html。大多数时候,我不关心`inline` 提示,只是在编译器认为合适的时候使用Makefile 中的优化标志来内联。 (2认同)

Tom*_*don 6

通常,编译器会选择内联,如果它决定性能会更好.因此,它具有比较实际调用非内联函数(参数推入堆栈,保存寄存器等)的成本比代码本身更多.因此,对于简单的访问器或简单的计算,通常情况下调用函数的成本更高,因此编译器将内联.

编译器通常也有大小限制,因此它们不允许内联过多地增加代码.

还有一些地方需要考虑.内联函数不太可能导致页面错误,可能不会导致处理器缓存未命中,因此从这个角度来看通常会更快.非内联函数通常需要将代码加载到处理器高速缓存中,相比之下这非常慢.

声明函数是内联的还有其他原因,即使您并不真的希望编译器内联它们.C++中的整个STL都是内联的,尽管大多数STL实际上都不是内联的.由于模板实例化的原因,以及与应用程序二进制接口等有关的问题,它以这种方式完成.