inline(内联)函数

关于内联函数的几点:

1.  对于那些函数体代码量很小,又经常调用的函数,一般用作内联函数。因为函数体代码很小,函数体执行的时间远小于调用函数的时间,从而提高代码执行效率。

2. 一般建议少用宏定义,改用内联函数。因为宏定义容易出错(如边界错误),而且宏定义只是编译时简单的替换,而内联函数含有类型安全检查和自动类型转换,这些是宏定义没有的。宏定义还有另一个缺点:无法操作类的私有数据成员。

3. 内联支持调试,宏定义不支持调试(assert除外)。宏定义只是简单的替换,内联在debug时相当于普通函数,此时并没有真正的内联,可以参与调试,在release时,才真正内联。

4. inline关键字是“定义型关键字”,inline只有写在定义前时,才是内联函数,如果inline仅写在声明前,而定义前没有的话,不算内联。

5. 内联定义一般写在头文件中,若写在源文件中,只能给本源文件使用。若其他源文件要使用,需重写下内联函数的定义,才可使用。而且两源文件中内联函数的定义必须相同。

换一种说法内联函数应该在头文件中定义,这一点不同于其他函数。编译器在调用点内联展开函数的代码时,必须能够找到 inline 函数的定义才能将调用函数替换为函数代码,而对于在头文件中仅有函数声明是不够的。当然内联函数定义也可以放在源文件中,但此时只有定义的那个源文件可以用它,而且必须为每个源文件拷贝一份定义(即每个源文件里的定义必须是完全相同的),当然即使是放在头文件中,也是对每个定义做一份拷贝,只不过是编译器替你完成这种拷贝罢了。但相比于放在源文件中,放在头文件中既能够确保调用函数是定义是相同的,又能够保证在调用点能够找到函数定义从而完成内联(替换)。)

6. 在头文件中加入或修改 inline 函数时,使用了该头文件的所有源文件都必须重新编译。

7. 有些函数即使声明为内联的也不一定会被编译器内联, 这点很重要; 

8. 慎用内联,有可能造成代码膨胀。


更新...

9. 一个函数若声明inline,则每处声明都必须保证是inline,类成员函数若在类定义内给出定义,则隐含inline。


你可能感兴趣的:(c++)