c - C 中的内联实际上是如何减慢该程序的速度的?

标签 c gcc compiler-construction compiler-optimization

为了强制不内联消耗 46% 运行时间的函数,我在其上使用了 __attribute__((noinline)) 并使用 gcc 编译了代码 - Wall -Winline -O2(这些加上 -g 是 Makefile 使用的 - 我在使用 -g 时也看到了大致相同的效果)使用 gcc 4.5.2。我发现使用非内联函数的程序比原来的程序快了 20% 以上。有谁知道为什么会这样?

让我提供更多细节。发生这种情况的程序是最新版本的压缩实用程序 bzip2对于 Linux。程序中的关键函数(在 compress.c 中找到的 generateMTFValues)是执行 Move To Front 转换的函数。该函数在程序中仅被一个函数调用。

有没有人知道为什么在这种情况下通过强制编译器不内联此函数程序运行得更快?该函数只接受一个参数——一个指向包含所有 block 和压缩信息的结构的指针。此外,它只调用一个实际上不会消耗任何大量处理时间的函数。

最佳答案

它会减慢程序速度,因为生成的代码会更大并且会导致更多 CPU 指令缓存未命中。

关于c - C 中的内联实际上是如何减慢该程序的速度的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5874681/

相关文章:

c - 包含的头文件是否在C文件中展开

c - 写系统调用

javascript - TypeScript 100.0% 是如何用 TypeScript 编写的?

c - 使用 C 中的 DTD 验证 Xml 文件

c - 正确的移位给出了错误的结果,有人可以解释一下吗

c - Fwrite/Fread 动态声明的结构 **

c - 我如何从源代码静态构建 GDB?

c++ - 将QJson静态编译成Qt Application(多次声明错误)

c - 使用 Write() 写入管道总是返回 0

c - 为什么浮点变量的地址及其指针不会产生相同的结果?