有三种函数是内联的:
- 被inline关键字显示声明的
- 被constexpr修饰的
- class/struct/union定义中出现的任何static和non-static成员函数
- 可以有多个相同的内联函数定义.但定义要出现在不同的编译单元,并且完全相同.
- 使用了内联函数的编译单元,必须含有内联函数的定义
这样的性质很麻烦,所以一般只有一个在头文件中的定义.
- inline函数中的static variable被所有编译单元共享
- inline函数中定义的类型(typedef)也被共享
inline本来是向编译器申请,把原本的函数调用,直接展开成相应的函数体代码去执行,从而避免函数调用引起的开销.比如栈,寄存器状态.
但是,标准把选择权交给了编译器.只要在执行时符合前小节提到的性质就行,无论是不是真的把函数展开.
编译器也可以选择把某些非内联函数展开,这取决于编译器的优化策略.