2013-02-05 62 views
2

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

我有一些经常调用的方法,他们确实应该内联。但是inline-annotated函数需要在头文件中实现,所以这会使得代码的安排得不太好。此外,我认为内联是一种编译器优化,应该对程序员透明地进行,因为它是有意义的。

那么,我是否必须用inline来注释我的函数是否发生了内联,或者当我用-O3或其他适当的优化标志进行编译时,GCC会如何计算出没有注释的?

+0

“*内联注释函数需要在头文件中实现*” - 这不是一个真实的陈述。 –

+0

链接时优化可以不在标题中内联函数。 “inline”的主要含义是“this * can * in the header”,但不是* must *。 –

+0

http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Inline.html尤其要注意的是(1)gcc只在内联时优化(使用-O标志)或使用* __属性__((always_inline ))*(2)有时由于技术原因无法内联(使用-Winline在发生这种情况时发出警告)(3)gcc可能决定内联未标记为内联的函数(使用-fno关闭此功能-default内联)。基本上,当你使用-O标志时,它将内联所有的内联函数,除非它不可能这样做。它可能内联没有标记为内联的其他功能。 – thang

回答

2

inline仅仅是一个建议,编译器是不正确的&是misleading.There是标志着一个内联函数的两个可能的影响:

  1. 函数定义内联替换到函数调用作出&
  2. 某些松弛与One definition rule,允许您在头文件中定义函数。

编译器可能会也可能不会执行#1,但它必须遵守#2。因此内联不仅仅是一个建议。一旦函数被标记为内联,将会应用一些规则。

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

1

常见的民间传说是gcc总是自行决定是否内联某些东西(取决于编译器/链接器选项,它甚至可以在链接时这样做)。您可以在使用-Winline时有时会观察到这一点,其中gcc警告忽略了内联提示,它通常甚至会提供一个原因。

如果你想知道到底发生了什么,你可能必须阅读它的源代码,或者读取它的人的话。

相关问题