初识C++ (四)
创始人
2024-04-02 12:35:28
0

作者:@小萌新
专栏:@初阶c++
作者简介:大二学生 希望能和大家一起进步!
内容简介: 本篇博客会简单的介绍内联函数
在这里插入图片描述
最好的都会在路上等着你

初识C++

  • 多次函数调用的缺陷
    • C语言解决方案
    • C++给出的解决方案: 内联函数
      • 概念
      • 运行
    • 内链函数的注意点
      • 1 内链只是建议
      • 2. 优缺点
      • 3. 不能声明定义分离
  • 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);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++程序中可以这么写

运行

inline int Add(int x, int y)
{return x + y;
}

在这里插入图片描述

我们首先先来看看最后结果怎么样

转到汇编代码

在这里插入图片描述
我们发现在执行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;

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

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

总结

在这里插入图片描述

本文简单介绍了内联函数 对比了内联函数还有宏
由于博主的水平有限所以难免博客中会出现纰漏 希望大佬们看到之后可以即使指正
最后如果这篇博客帮助到了你 别忘了一键三连啊
阿尼亚 哇酷哇酷!

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...