初识C++(四)

ops/2024/11/18 5:09:59/

最好的都在路上

多次函数调用的缺陷 

我们先来看代码

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;

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

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

总结

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

 


http://www.ppmy.cn/ops/134631.html

相关文章

从dos上传shell脚本文件到Linux、麒麟执行报错“/bin/bash^M:解释器错误:没有那个文件或目录”

[rootkylin tmp]#./online_update_wars-1.3.0.sh ba51:./online_update_wars-1.3.0.sh:/bin/bash^M:解释器错误:没有那个文件或目录 使用scp命令上传文件到麒麟系统,执行shell脚本时报错 “/bin/bash^M:解释器错误:没有那个文件或目录” 解决方法: 执行…

wordpress使用相关

这里写目录标题 遇到的相关问题WordPress安装插件过程中遇到需要ftp出现确实XMLReader 插件的提示cURL Support Missing(curl 缺失) 遇到的相关问题 WordPress安装插件过程中遇到需要ftp 一般在这个位置 出现确实XMLReader 插件的提示 解决&#xff1a…

第二十章 TCP 客户端 服务器通信 - 立即发送模式(Q 模式)

文章目录 第二十章 TCP 客户端 服务器通信 - 立即发送模式(Q 模式)立即发送模式(Q 模式)流模式(S模式)缓冲区大小 服务器端OPEN命令 第二十章 TCP 客户端 服务器通信 - 立即发送模式(Q 模式) 立即发送模式…

第二十一章 TCP 客户端 服务器通信 - 客户端OPEN命令

文章目录 第二十一章 TCP 客户端 服务器通信 - 客户端OPEN命令客户端OPEN命令 第二十一章 TCP 客户端 服务器通信 - 客户端OPEN命令 客户端OPEN命令 客户端OPEN命令与服务器端OPEN命令只有一个方面的不同:第一个设备参数必须指定要连接的主机。要指定主机&#xf…

本地项目运行提示跨域问题

项目背景:我使用phpwebstudy在本地搭建了一个项目,然后前端是http://localhost:8080/ 后端我直接创建了一个本地域名,例如www.abc.com 然后vue.config.js配置如下,这个配置在我所有线上环境是没有任何问题的 devServer: {proxy…

网络服务综合项目-博客

一、运行环境: 主机主机名系统服务192.168.31.128Server-WebLinuxWeb192.168.31.129Server-NFS-DNSLinuxNFS 二、基础配置: 配置主机名开启防火墙并配置部分开启selinux并配置服务器之间使用ntp.aliyun.com进行时间同步服务器之间实现ssh免密登录 三…

《JVM第10课》内存溢出(OOM)排查过程

文章目录 常用命令1. jps2. jconsole3. jstat4. jmap 工具1.jvisualvm 排查OOM的方法其实很简单很简单。 如果能找到拋OOM的日志,可以在日志里看到是哪一行抛出的OOM异常。如果找不到日志,那么处理方式是导出Java进程的内存快照,然后用工具查…

在Node.js中如何使用TypeScript

第一步:创建一个Node.js项目的package.json文件 npm init -y第二步:添加TypeScript、添加node.d.ts npm install typescript -D npm install types/node -D第三步:初始化一个tsconfig.json文件 npx tsc --init --rootDir src --outDir lib…