根据一些书籍,类中定义的函数(以及标头中的定义(总是内联的。这是真的吗?
我们如何使用测试应用程序创建这样的场景?
类定义中定义的函数隐式标记为inline
。
[C++11: 9.3/2]:
成员函数可以在其类定义中定义(8.4(,在这种情况下,它是内联成员函数(7.1.2(,或者,如果它已经声明,但没有在其类的定义中定义,它可以在类的定义之外定义[..]
这并不等同于说它们将被内联。
inline
关键字对存储持续时间和链接要求有影响,必须遵守这些。
[C++11: 7.1.2/2]:
带有inline
说明符的函数声明(8.3.5、9.3、11.3(声明了内联函数。内联说明符向实现指示,与通常的函数调用机制相比,在调用点对函数体的内联替换更可取。在调用点执行此内联替换不需要实现;然而,即使省略了这种内联替换,仍应遵守7.1.2中定义的内联函数的其他规则。
然而,现在,编译器将根据函数自身的度量来决定是否物理内联函数,而不是根据inline
关键字的存在与否(因为,坦率地说,现在编译器最清楚(。
我不知道你想的是什么"测试应用程序",但代码中的一个例子很简单:
struct T
{
void foo() {} // implicitly `inline`
};
是的,这是真的,类中定义的成员函数是隐式内联声明的。但inline
只是您给编译器的一个建议。编译器可以忽略它。
如果你想看看不同的场景会发生什么,你可以阅读汇编程序