内联函数是C++为了提高程序运行速度所做的一项改进,常规函数和内联函数之间的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中。
内联函数,顾名思义,就是有内联的函数,那么具体是什么内联呢?
内联函数的编译代码与其他程序代码“内联”起来了。也就是说编译器将使用相应的函数代码替换函数调用。对于内联代码,程序无需跳转到另一个位置执行代码,再跳回来。因此,内联函数的运行速度比常规函数稍快,但有利就有弊,代价就是需要占用更多的内存。通俗地讲就是拿空间换时间。如果程序在10个不同的地方调用同一个内联函数,则该程序将包含该代码的10个副本。
其实说白了就是程序员发扬用最少代码干最多事情的优良传统。程序员不想重复的写一个简单代码,就启用了调用函数,但是调用函数是要消耗时间的(系统要来回找地址,来回调),所以内联函数应运而生,这样既不用重复写简单代码,又不用消耗调用时间,但是世界是公平的,所以只能让内存这个怨种来背锅。就只能牺牲内存来换取时间和便利。
好啦,不扯了,下面我们正式开始对内联函数的学习。
指定内联函数的方法只需要在函数定义处增加 inline 关键字。见代码
inline void Swap(int& x1,int& x2)
{
int temp=x1;
x1=x2;
x2=temp;
}
要点:
1.要在函数定义处添加 inline 关键字,在函数声明处添加 inline 关键字虽然没有错,但这种做法是无效的,编译器会忽略函数声明处的 inline 关键字。
2.inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开了,就没有地址了,链接就会找不到。
3.inline对编译器来说是一个建议,编译器会自动优化,如果1.内联函数体内有循环/递归 2.函数体内代码较多的(多余20行),编译器优化时就会忽略内联。如果程序在10个不同的地方调用同一个内联函数,则该程序将包含该代码的10个副本,所以频繁调用小函数(交换)时,才用内联函数。
前面提到牺牲空间来换取时间,在C语言里也有类似的案例,在C语言里是通过宏来实现的。
C语言的宏:
优点:
1.增强代码的复用性。
2.提高性能。
缺点:
1.不方便调试宏(因为预编译阶段进行了替换,有时会出现优先级等问题)
2.宏使代码可读性变差,可维护性差,容易误用。
3.没有类型安全的检查。
C++有哪些技术代替宏?
1.常量定义 换用const
2.短小函数定义 换用内联函数。