【发布时间】:2014-05-21 16:50:04
【问题描述】:
根据标准,C++ 中成员函数的内联定义与使用inline 关键字声明它是一样的。请记住,我编写的大多数模板只包含内联函数,因为这样代码更短(函数的主体也必须在标题中,以便可以从多个 .cpp 文件中使用,因此它可以说只会减慢解析速度)。
现在(健全的)编译器是否会尝试内联所有函数?在实践中将内联成员函数定义为inline 有什么好处(见下面的例子)?从现在开始我是否应该避免在模板中编写内联函数?
template <class Foo>
struct Bar {
inline bool IsThereBenefitInDoingThis()
{
return 10 < system("exit `wget -q -o - "
"http://stackoverflow.com/questions/23789353/ | grep yes | wc -l`");
}
};
【问题讨论】:
-
类定义中定义的任何函数都是内联的,隐式的。
-
当然,如果可以避免的话,您不希望将函数定义放在类定义中。它实际上破坏了类的可读性。 (在大多数情况下,如果可以避免的话,您甚至不希望它们在同一个文件中。)
-
@JamesKanze 是的,我知道将函数体放在
.hpp文件中并将#includeing 放在原始标题中的做法。在这种情况下,问题更多是关于编译器是否真的遵守标准。 -
许多编译器会执行内联的成本/收益分析,也许考虑到用户使用了
inline。但是inline不强制内联。来自 C++11 标准,[dcl.fct.spec]/3 " inline 说明符向实现表明,在调用点对函数体进行内联替换优于通常的函数调用机制。一个实现不需要在调用点执行此内联替换 [...]" -
(Stepanov 在他的一次演讲中说,在某些情况下帮助编译器仍然有用。如果有疑问,请测量。)