内联函数
内联函数的发明调和了有参宏和普通函数之间的矛盾。
先回顾C语言中的有参宏和函数的各自优缺点
以宏和函数分别实现比大小为例:
宏
#include"stdafx.h"
#include <iostream>
#define MyMax(a,b) (((a)<(b))?(b):(a))
int main(int argc, char* argv[])
{
printf("%d\r\n", MyMax(3, 5));
return 0;
}
函数
int MyMaxFun(int a, int b)
{
return (((a) < (b)) ? (b) : (a));
}
int main(int argc, char* argv[])
{
printf("%d\r\n", MyMaxFun(3, 5));
return 0;
}
以上两种方法哪种效率高?
答案是 宏。
因为宏没有传参、栈帧等过程。缺点是没有类型检查。
也就是当比较字符串时,情况如下:
普通函数效率较低,但是有类型检查。
当比较字符串时,是没办法比较的,如下图:
C++想统一效率和类型检查的优点,就发明了内联函数
关键字
inline
放在函数返回值之前,修饰函数即可。
inline int MyMaxFun(int a, int b)
{
return (((a) < (b)) ? (b) : (a));
}
int main(int argc, char* argv[])
{
printf("%s\r\n", MyMaxFun(3,5));
return 0;
}
内联函数原理
被标记为内联的函数,当编译器编译时,会做出判断,如果函数内部简单,就会将函数内部的代码直接替换出,而不进行函数调用。
不是所有函数都能内联,复杂的函数无法内联。
比如上面的代码,编译器可能直接处理为:
int main(int argc, char* argv[])
{
printf("%d\r\n", (((3) < (5)) ? (5) : (3)));
return 0;
}
内联函数的注意事项
- 不是所有函数都能被内联展开,取决于编译器。一般来说,简单的函数能被内联。
- dubug版本默认是会忽略内联的,release版本追求优化,才会主动内联。
- 内联函数的实现, 必须要发在头文件中。只有这样,编译器在内联展开时,才会找到对应的实现代码进行替换。
- C++会处理内联函数实现放在头文件中的重复包含问题,不会出现链接错误。
问题:什么是内联函数?
可从关键字、优点、原理角度来谈。