最好的都在路上
多次函数调用的缺陷
我们先来看代码
int Add(int x, int y)
{return x + y;
}
int main()
{int ret = 0;ret = Add(2, 3);ret = Add(2, 3);ret = Add(2, 3);ret = Add(2, 3);ret = Add(2, 3);ret = Add(2, 3);ret = Add(2, 3);return 0;
}
根据我们在函数栈帧这节课中学到的知识
这样子调用函数有什么缺陷?
这是是不是会频繁的调用函数栈帧啊
C语言解决方案
这里c语言中是不是给出了一种解决方案 叫做 宏
我们来尝试用宏改写下这个函数
#define Add(x,y) ((x)+(y))
这样子
注意 这里有很多不注意宏的写法的同学会出现各种各样的错误
比如说宏内部写成 int x int y
又或者说 忘记在x y以及x y的运算上加括号
写成宏定义之后就能减少函数栈帧的调用 从而提高一定的效率了
C++给出的解决方案: 内联函数
概念
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调
用建立栈帧的开销,内联函数提升程序运行的效率。
还是以我们上面的ADD函数为例
我们在c++程序中可以这么写
我们发现在执行ADD宏的时候并没有call建立新的函数栈帧
那我们再来看看内联函数的
我们发现 咦 这里怎么call了一个Add函数啊
这是因为这里 我们需要开一下内链的优化
不然会系统默认不会使用内链函数
内链函数的注意点
1 内链只是建议
你敲出这么一行代码
inline int Add(int x, int y)
并不是说编译器就会使用内联函数了
它会有一个自己的判断
也就是说 你的这一行命令只是起到建议作用
2. 优缺点
inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会
用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运
行效率。
缺点很好理解 函数展开了目标文件自然就变大了
优点也是 没有栈帧的调用了 那么效率自然也就提升了
3. 不能声明定义分离
inline不建议声明和定义分离,分离会导致链接错误。
那么这是为什么呢?
因为在使用inline之后 函数就会被展开
那么这样子是不是就没有函数地址了啊
所以说就找不到了
C++中替代宏的手段
- 常量定义 换用const enum
- 短小函数定义 换用内联函数
简单介绍下
比如说我们想定义一个常量N = 10
在c语言中可以这么定义
#define N 10
但是在我们的C++中就可以这么定义
const int N = 10;
这样子就成功替换了宏的使用
而对于函数来说 使用内联函数来替换宏上面已经介绍过了
总结
本文简单介绍了内联函数 对比了内联函数还有宏
由于博主的水平有限所以难免博客中会出现纰漏 希望大佬们看到之后可以即使指正