C ++内联单个调用函数?

时间:2015-12-26 19:43:33

标签: c++

在C中,GCC将使用单个调用者自动内联所有静态函数。我不知道如何在CPP中实现同样的目标。

在上面的示例中,foo()是私有的,它只能由bar调用。 foo()太大而无法放在.h文件中。如何使foo()内联?

class A
{
 private:
   void foo();
   void bar();
}

void A::foo() {
   // do something here
}
void A::bar() {
   foo();
}

3 个答案:

答案 0 :(得分:1)

编译器只能内联它是否可以在编译调用站点时看到函数体。

如果您将foofoo的定义放在同一个源文件中,那么您可以为编译器提供内联bar的最佳机会。

当然,这可能对性能没有太大影响,具体取决于{{1}}和{{1}}中的确切内容。

答案 1 :(得分:1)

即使没有inline,GCC甚至可能会在这种情况下自动内联该方法。它是否会基于优化器中的启发式,因此是不可预测的,但如果函数很大,它可能不会。

您可以在类中的foo()声明或impl.cpp中的定义上放置内联指令。根据C ++标准的第9.3节就足够了。但GCC实际上可能并没有实际内联函数,所以它仅作为弱提示和/或文档有用。

在C和C ++中,无论有没有inline,除非启用优化,否则GCC不会内联任何内容。强制它的唯一方法是使用Danny_ds's answer,但这样做并不一定是个好主意。优化器非常善于了解它是否有用,而简单的函数调用实际上可以在现代CPU上实现极低的开销。因此担心它可能有点像“过早优化”。

// header.h
class A
{
 private:
   /*inline*/ void foo(); // inline could be here
   void bar();
};

// impl.cpp

inline void A::foo() {
   // do something here
}

void A::bar() {
   foo();
}

您不必仅将foo()的定义放在头文件中,因为正如您所说,它仅由bar()使用。如果它是一个可以在其他单元中调用的公共方法,则需要将该定义放在标题中,然后必须将其标记为inline,以便它更改链接,并且它不是一个错误的倍增定义

这最后一种情况确实是使用inline关键字的唯一原因(在模板代码中出现了很多),否则让优化程序弄清楚可能会更好。

答案 2 :(得分:0)

您可以使用inline关键字,或者当优化关闭时,请使用:

__attribute__((always_inline))
  

除非你没有优化,否则GCC不会内联任何功能   指定函数的'always_inline'属性,如下所示:

 /* Prototype.  */
 inline void foo (const char) __attribute__((always_inline));

请参阅https://gcc.gnu.org/onlinedocs/gcc/Inline.html