函数体简单: 内联函数的函数体应该足够简单。如果函数体过于庞大,内联函数的好处可能会被抵消,而且可能导致固件大小膨胀。
避免复杂控制流: 内联函数的函数体不应包含复杂的控制流结构,例如递归、大型循环或者复杂的条件语句。这是因为内联函数需要在调用点展开,而这些结构会使得展开后的代码过于复杂。
避免与宏混用: 内联函数和宏有相似的作用,但是它们有不同的使用规则。混用时要注意,以免出现不可预料的问题。宏在预处理阶段展开,而内联函数是在编译阶段展开,因此在参数使用等方面有差异。
内联函数不可递归: 内联函数本身不应是直接递归函数。由于内联函数在每次调用点都会展开,如果内联函数直接或间接地调用自身,可能导致无限展开,造成编译器错误或者无限循环。
inline 关键字的使用: inline 关键字必须与函数的定义体放在一起,仅将 inline 放在函数声明前不起作用。函数的定义体应在同一个编译单元中可见,以便编译器能够进行内联。
编译器的自由裁量权: inline 仅仅是对编译器的建议,最终是否真正内联由编译器决定。复杂函数体、递归函数等情况可能会使编译器忽略 inline 建议。
头文件中的内联函数: 内联函数的定义通常放在头文件中,以便在每个调用点都能看到定义。这有助于编译器在调用点展开内联函数。
与静态修饰符结合使用: 在一些情况下,使用 static 和 inline 结合使用,可以使内联函数在文件内部可见,不会污染命名空间。
|