IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++关键字之inline(面试) -> 正文阅读

[C++知识库]c++关键字之inline(面试)

函数调用流程

我们知道,函数调用时需要一定的时间和空间的开销。
函数的调用过程可以做如下理解:
在这里插入图片描述

1.程序先执行函数调用之前的语句
2.流程的控制转移到被调用函数的入口处,同时进行参数传递
3.执行被调用函数中函数体的语句
4流程返回到函数调用的下一条指令处,将函数返回值带回
5接着执行主函数中未执行的语句。

这样的调用过程,就要求在转去被调用函数之前,要记下当时执行的指令的地址,还要保护现场(记下当时相关的信息),以便在函数调用之后,流程返回到先前记下的地址处,并且根据记下的信息恢复现场,然后继续执行。这些都要花费时间。
c++提供一种提高效率的方法,在编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程转出去,这种嵌入到主函数的代码称为内嵌函数,或者叫内置函数,或者叫内联函数。

声明内联函数

指定内联函数的方法很简单,只需在函数首行的左端加一个关键字inline即可。

#include<iostream>
using namespace std;
inline int max(int, int,int c);//内联函数声明

//主函数
int main()
{
	int i = 10, j = 20, k = 30;
	cout << max(i, j, k) << endl;
	return 0;
}
inline int max(int a,int b,int c)
{
	if (b > a)
		a = b;
	if (c > a)
		a = c;
	return a;
}

注意:

可以在声明和定义函数时同时写inline,也可以只在函数声明时加inline,而定义时不加inline。主要在调用该函数之前把inline的信息告诉编译系统,编译系统就会在处理函数调用时按内联函数处理

应当说明的是:

对函数做inline声明,只是程序设计者对编译系统提出的一个建议,也就是说它是建议性的,不是指令性的。并非一经指定为inline,编译系统就必须这样做。编译系统会根据具体的情况决定是否这样做。内联函数inline一般要是定义在头文件中,这与通常的函数定义是不一样的。

inline与宏定义区别

简单的讲inline的作用与 宏定义 作用相同,但是又不尽相同。
具体来说

宏定义

宏定义可以定义变量和表达式。

1、 C中使用define这种形式宏定义的原因是因为,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用 预处理器实现,没有了 参数压栈,代码生成等一系列的操作,因此,效率很高,这是它在C中被使用的一个主要原因。

2、这种 宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器 符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++ 编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。

3、在C++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this 指针放在合适的位置)。

简单的概括就是宏定义表达式或函数,无法发挥宏定义最大化,为了避免这些缺点,引入了 inline,这个inline既吸收了宏定义的优点,又扩展了宏定义。

inline推出的目的就是消除宏定义的缺点,同事又很好地继承了宏定义的优点。

内联函数

inline的作用如下:

1、inline 定义的内联函数,函数的代码被放入 符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。

2、很明显,类的内联函数也是一个真正的函数, 编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。

3、inline 可以作为某个 类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 16:38:20  更:2021-10-01 16:39:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 18:44:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码