C++ inline 简单探讨

前段时间在写代码的时候,发现了关于内联 inline 的一些细节,挑重要的放在这里,做一个集中记录。

🌟 以下总结使用 inline 的一些注意事项,均针对多文件 C++ 工程:


  1. 在 class 内部定义的 member function,函数前不需要添加 inline,因为编译器在编译的时候会默认 inline 它。但是,到底能不能成为 inline function,这个要看编译器的能力,如果你的这部分代码量较大较复杂,编译器即使想 inline 也没法 inline。不过在这种情况下,如果你想加 inline,也是可以的,作为一种显式的声明。

  2. 在 class 外部定义的 member function,如果你想让它 inline,就需要在函数定义前加上 inline,同时,这个 member function 的定义还需要放在类的头文件中(或写在同一个源文件中),否则在编译的时候会无法进行置换,就会报错 undefined reference

  3. 按第 2 点提到的,要把 inline function 的定义和 class 的定义写在同一个头文件(或源文件)中,这样做是 ok 的,没有问题,但是会造成类的接口和类的实现没有分类开,不利于信息隐藏(比如你的代码要给别人用,你又不想给源码,你就可以把源文件编译好,给别人一个头文件说明接口就行了)。这样的做法在实际工程中,除非对程序的执行效率有非常高的要求,一般还是会把接口和定义分开两个文件去写。除非这个在类外定义的 member function 体量很小,且需要高频调用,才会在前面加上 inline。

  4. 按第 2 点提到的,在 class 外定义的 inline function 要要在函数定义前加上 inline,那么函数声明处也要加 inline 吗?答案是,不需要,但是加也可以。因为关键字 inline 必须要和函数定义放在一起才能使函数成为内联,如果只把 inline 放在函数声明前是没有作用的。同时,inline 正常我是不会加在函数声明前的,因为这样做不会影响函数功能,还可以提升代码的大气水平,毕竟声明和定义不是一种东西,且使用我代码的用户也没需要、没必要知道这个函数是否为 inline function。

  5. 在这里再提一下 inline 的作用。程序调用函数时间花销是很大的,如果一个函数运行完只需要 0.05s,但是调用程序却要花费 0.1s,这样的调用明显会影响程序的运行效率。如果在这个函数前加上 inline,编译器就会把函数代码拷贝嵌入到函数的调用点,这样就不会有调用函数的花销了,从而提升程序运行效率。

  6. 按第 5 点描述的,inline 就没有坏处吗?inline 虽然省去了函数调用的时间,但是会造成代码体积膨胀,换句话说,用内存空间换时间。但是用侯老师的话来说,这也是一种必要的行为,当然他的意思肯定是不针对复杂函数。在我看来的话,如果函数体积较大或包含循环等其他复杂结构控制语句,要不要 inline 你自己心里还不知道吗?