读网站建设一定要买电脑实践吗,网络广告策划流程,施工企业春联,中山企业营销型网站制作目录
概念#xff1a;
与宏的对比#xff1a;
函数膨胀#xff1a;
内联函数的特性#xff1a;
概念#xff1a;
以inline修饰的函数叫做内联函数#xff0c;编译时C编译器会在调用内联函数的地方展开#xff0c;没有函数调 用建立栈帧的开销#xff0c;内联函数…
目录
概念
与宏的对比
函数膨胀
内联函数的特性
概念
以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数调 用建立栈帧的开销内联函数提升程序运行的效率。
举例inline int Add(int a, int b)
{return a b;
}int main()
{int ret1 Add(1, 2) * 3;int x 1, y 2;int ret2 Add(x | y, x y);return 0;
}
内联函数的本质其实和C语言中的宏函数相差不多但是对比于宏内联函数仅仅只是代替和替换并不会像宏函数一样在替换的同时建立栈帧。
换句话说内联函数只是替换和展开而非调用和建立栈帧 与宏的对比
而关于宏函数虽然宏能够解决这种“需要频繁调用”、“且建立栈帧”的问题但是宏的缺陷也十分的明显
语法复杂坑很多不容易控制不能调试没有类型安全的检查
#define ADD(a,b)((a)(b)) //正确写法#define ADD(a,b) ab // 会有ret1 的情况发生 #define ADD(a,b)(ab) // 会有ret2的情况发生//这个宏的本质其实是 将ADD(参数1 ,参数2 ) 替换成 参数1参数2
//但是直接替换所以要考虑的问题很多 int main()
{int ret1 Add(1, 2) * 3;int x 1, y 2;int ret2 Add(x | y, x y);return 0;
}
因为宏的本质上是替换所以对于需要替换的内容十分的严谨倘若一步错则步步错所以对于宏而言内联函数其实是更加完善的可以说内联函数其实是完善了宏的问题解决了宏的缺点。
函数膨胀
实际上内联函数使用的场景并不是很多很多时候内联函数只是也只能使用在较为小型的函数当中如果是较为大型或者调用函数的次数非常多时内联函数就会导致函数膨胀问题的发生
举例如果inline定义了一个大概有着一百行的代码作为内联函数而调用这个内联函数的代码有一万行那么根据内联函数的替换原理大概就会有一百万行的代码的运行量在这串代码当中。
所以这也是为什么说内联函数实际上是空间换取时间的原因 内联函数的特性
1. inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段会 用函数体替换函数调用缺陷可能会使目标文件变大优势少了调用开销提高程序运 行效率。
2. inline对于编译器而言只是一个建议不同编译器关于inline实现机制可能不同一般建 议将函数规模较小(即函数不是很长具体没有准确的说法取决于编译器内部实现)、不 是递归、且频繁调用的函数采用inline修饰否则编译器会忽略inline特性。
3. inline不建议声明和定义分离分离会导致链接错误。因为inline被展开就没有函数地址 了链接就会找不到。
// F.h
#include iostreamusing namespace std;inline void f(int i);// F.cpp
#include F.hvoid f(int i)
{cout i endl;
}// main.cpp
#include F.hint main()
{f(10);return 0;
}