inline关键字的真正用途
背景
在很长一段时间里,我一直以为inline关键字的作用就是给编译器提建议,让函数内联到代码中。然而今天偶然在逛b站时发现之前的理解有误,于是重新整理如下。
cppreference对inline的描述

简单翻译就是说,一个inline函数满足以下方面:
- inline函数的定义必须能在本单元被找到。因为inline函数实际上是仅内部可见,无法依靠其他单元提供定义。(实际上,inline函数的声明和定义一般是一起写的,而模板函数就是默认inline,因此不能分离。毕竟模板的特化是在编译时期决定的,如果将定义单独放在一个单元,那么只能等到链接才知道定义需要被特化成哪些版本,这个时候再来修改编译单元已经晚了)。
- 如果一个inline函数没有被声明为static,那么符合以下方面(如果为static,每个单元使用的inline函数就不是同一个了)
a. 一个inline函数可以被多次定义,但一个编译单元只能定义一次,并且每个定义都相同。(常用的方法就是在头文件中写inline函数的定义,对于一些header-only库很常见)
b. 多次定义中的每一次都需要声明inline
c. 该函数在每个编译单元都具有相同地址。这句话是指他们最终指向的都是同一个函数,如果函数有局部的static变量,不同编译单元都会访问同一个变量。
有趣的是,cppreference中指出,inline的原本含义就是提示编译器对函数进行内敛的优化,原文中使用了the original intent一词

注意点
cppreference指出,如果多处定义inline,但定义不同,那么程序将是ill-formed的,但不需要诊断提示。
此外,如果单元内没有inline函数的定义,只有声明,那编译器会无视inline,将其作为普通函数,等待链接时补全定义。
总结
使用inline不再是为了内联优化,而是想要在头文件中实现函数定义(不用inline的话,这么做会报重复定义的错误)


浙公网安备 33010602011771号