C++ 在C+;中使用内联优化有哪些注意事项+;功能?

C++ 在C+;中使用内联优化有哪些注意事项+;功能?,c++,optimization,inline,C++,Optimization,Inline,内联不同类型的函数有什么好处?在围绕它们进行开发时,我需要注意哪些问题?我对探查器不是很有用,但许多不同的算法应用程序似乎可以将速度提高8倍以上,如果你能给我一些有用的指针的话。内联函数经常被“过度使用”,其后果是非常严重的。Inline向编译器指示可以考虑对函数进行内联扩展。如果编译器选择内联函数,则不会调用该函数,而是将其复制到适当的位置。性能增益来自于避免函数调用、堆栈帧操作和函数返回。收益可能相当可观 注意,它们可能会增加程序大小。它们可以通过减少调用方的引用位置来增加执行时间。当大小增

内联不同类型的函数有什么好处?在围绕它们进行开发时,我需要注意哪些问题?我对探查器不是很有用,但许多不同的算法应用程序似乎可以将速度提高8倍以上,如果你能给我一些有用的指针的话。

内联函数经常被“过度使用”,其后果是非常严重的。Inline向编译器指示可以考虑对函数进行内联扩展。如果编译器选择内联函数,则不会调用该函数,而是将其复制到适当的位置。性能增益来自于避免函数调用、堆栈帧操作和函数返回。收益可能相当可观

注意,它们可能会增加程序大小。它们可以通过减少调用方的引用位置来增加执行时间。当大小增加时,调用者的内部循环可能不再适合处理器缓存,从而导致不必要的缓存未命中,从而影响性能。内联函数也会增加构建时间——如果内联函数发生变化,则必须重新编译世界。一些准则:

  • 避免内联函数,直到分析表明哪些函数可以从内联中受益
  • 在分析自动内联和不自动内联之后,考虑使用编译器的自动内联选项
  • 仅限函数调用开销相对于函数代码较大的内联函数。换句话说,内联大型函数或调用其他(可能是内联的)函数的函数不是一个好主意

    • 最重要的一点是,在几乎所有情况下,您都应该让编译器完成它的工作,而不必担心它


      编译器可以自由执行函数的内联扩展,即使您没有声明它
      内联
      ,编译器也可以自由不执行内联扩展,即使您声明它
      内联
      。这完全取决于编译器,这是可以的,因为在大多数情况下,它比您更清楚什么时候应该内联扩展函数。

      内联函数的主要好处是可以消除调用开销,并允许编译器跨调用边界进行优化。通常,您给优化器的自由度越高,您的程序的性能就越好

      缺点是该函数不再存在。调试器无法告诉您是否在调试器内部,并且外部代码无法调用调试器。您也不能在运行时替换它的定义,因为函数体存在于许多不同的位置

      此外,二进制文件的大小也会增加


      通常,如果函数没有外部调用方,则应该声明函数
      static
      ,而不是将其标记为
      inline
      。只有在确定没有负面副作用的情况下,才允许函数内联。

      编译器内联工作比程序员做得更好的原因之一是成本/收益权衡实际上是在机器抽象的最低层次上决定的:有多少条汇编指令组成了要内联的函数。考虑典型的非分支汇编指令的执行时间与函数调用之间的比率。对于机器代码生成器来说,这个比率是可以预测的,因此编译器可以使用这些信息来指导内联

      高级编译器通常会尝试处理另一个内联的机会:当函数B仅从函数a调用,而从未从其他地方调用时。这种内联不是出于性能原因(假设A和B不是小函数),而是通过减少需要生成的“函数”总数来减少链接时间

      添加示例

      编译器执行大规模内联(具有大规模加速)的一个例子是STL容器的编译。STL容器类被编写为高度通用的,作为回报,每个“函数”只执行一点点操作。禁用内联时,例如在调试模式下编译时,STL容器的速度会显著下降

      第二个例子是,被调用函数包含某些指令,这些指令要求堆栈在调用方和被调用方之间不受干扰。这在使用内部函数的SIMD指令中发生。幸运的是,编译器足够聪明,可以自动内联这些被调用函数,因为它们可以检查是否发出SIMD汇编指令并内联这些指令,以确保堆栈不受干扰

      底线


      除非您熟悉低级评测并且擅长,否则最好让编译器来完成这项工作。STL是一种特殊情况,在这种情况下,即使在调试模式下也可以启用内联(使用开关)。

      函数调用开销非常小。内联函数的一个更显著的优点是能够直接使用“按引用”变量,而不需要额外的指针间接寻址。如果一个函数大量使用通过引用传递的参数,那么如果它的参数转移到简单的变量或字段中,它可能会受益匪浅。

      会更喜欢“它比你我知道得多”的说法,尽管我知道你的意思that@chubsdad:代词“you”可以表示“任何人”或其他未指明的“某人”它不一定要挑出OP或可能阅读此答案的某些人的子集。这是这个词的常用用法。虽然全局变量在程序中不太好,但是全局变量还是很好的!事实上,我喜欢这些观点,感谢profiler提供的信息(我仍然不擅长),事实上,正如你所说,这只是一个提示,最近,编译器似乎也这么认为。这是好的:)最后一点只有在一个大函数被多次调用时才有效。对于