使用-O3编译时将函数标记为内联?

时间:2013-02-05 15:34:27

标签: c++ performance gcc inline

C ++允许您使用inline关键字注释函数。据我所知,这为编译器提供了内联函数的提示(但没有义务),从而避免了小函数调用开销。

我有一些经常调用的方法,它们确实应该被内联。但是inline - 带标注的函数需要在头文件中实现,因此这使得代码排列不当。此外,我认为内联是一种编译器优化,它应该对程序员透明地发生。

那么,我是否必须使用inline注释我的函数以进行内联,或者当我使用-O3或其他适当的优化标志进行编译时GCC是否在没有注释的情况下解决这个问题?

2 个答案:

答案 0 :(得分:2)

inline只是对编译器的建议不正确&是误导性的。标记函数内联有两种可能的影响:

  1. 将函数定义内联替换为函数调用的位置&
  2. 某些放松w.r.t One definition rule,允许您在头文件中定义函数。
  3. 编译器可能会也可能不会执行#1,但必须遵守#2。所以内联不仅仅是一个建议。一旦函数被标记为内联,有一些规则将被应用。

    作为一般准则,请勿为优化标记您的函数inline。大多数现代编译器将在没有您的帮助的情况下自行执行这些优化。如果您希望将它们包含在头文件中,请标记您的函数inline,因为这是在不破坏ODR的情况下在头文件中包含函数定义的唯一正确方法。

答案 1 :(得分:1)

常见的民间传说是gcc总是自己决定(基于一些成本启发式)是否内联或不内联(取决于编译器/链接器选项,它甚至可以在链接时这样做)。您可以在使用-Winline时观察到这种情况,其中gcc警告忽略内联提示,它通常会给出原因。

如果你想确切地知道发生了什么,你可能需要阅读它的源代码,或者听取读者的话。