初识C++(四)

最好的都在路上

多次函数调用的缺陷 

我们先来看代码

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++中替代宏的手段

  1. 常量定义 换用const enum
  2. 短小函数定义 换用内联函数

简单介绍下

比如说我们想定义一个常量N = 10

在c语言中可以这么定义

#define N 10

但是在我们的C++中就可以这么定义

const int N = 10;

这样子就成功替换了宏的使用

而对于函数来说 使用内联函数来替换宏上面已经介绍过了

总结

本文简单介绍了内联函数 对比了内联函数还有宏
由于博主的水平有限所以难免博客中会出现纰漏 希望大佬们看到之后可以即使指正

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值