在C++中,可以这样声明类成员函数:
在类内(内联定义):
class A { void foo() { /* ... */ } // 直接在类内 };
这种函数被认为是隐式的inline。
在类内(仅声明):
class A { void foo(); // 仅声明 }; void A::foo() { /* ... */ } // 在类外定义
区别:
inline,编译器可以将这样的函数直接嵌入其调用的代码中。inline,除非显式指定(inline),尽管可以添加关键字:
inline void A::foo() { /* ... */ }
方法的优缺点:
类内定义的函数,编译器总会实际内联吗?
答案:**不。**关键字inline(包括在类内定义时的隐式赋值)仅仅是对编译器的建议。如果编译器认为函数过于复杂或不适合内联,可能会忽略此建议。
故事1
在一个大型项目中,成员函数被定义为
inline在头文件中并包含在成千上万的翻译单元中,结果编译时间增加了几倍,二进制文件因代码重复而增大——编译器并不总是合并相同的机器实现。
故事2
为了加快执行速度,开发者将整个类逻辑放在声明中(在.h文件中)。这导致在更改函数时,整个项目被重新编译,而不是仅重新编译实际受到影响的单个文件。
故事3
新来的团队成员将长序列化和文件操作方法直接放入模板类的声明中,导致错误在所有翻译单元中意外传播,且可执行文件大小无故增长而未提升性能。