在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();
}
答案 0 :(得分:1)
编译器只能内联它是否可以在编译调用站点时看到函数体。
如果您将foo
和foo
的定义放在同一个源文件中,那么您可以为编译器提供内联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));