我是靠谱客的博主 孝顺八宝粥,最近开发中收集的这篇文章主要介绍C++ —— 内联函数1.内联函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 1.内联函数
    • 1.1 内联函数的由来
    • 1.2 内联函数的概念
    • 1.3 内联函数的特性


1.内联函数

1.1 内联函数的由来

经过长期的学习,我们已经知道了函数的调用是需要建立栈帧的,那么在C语言中,如何实现一个函数,并且在调用时不建立栈帧呢?
答案是:使用宏函数宏函数在预处理阶段就会进行展开,并不会建立栈帧;
但是宏有以下的缺点
1.不能进行调试;
2.参数没有类型;
3.宏容易写错

基于上面的这些缺点,C++就提出了内联函数这个概念,它几乎解决了宏的所有问题;

1.2 内联函数的概念

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率;
先来看看C语言转成汇编后调用函数是什么样子的:

int Add(int left, int right)
{
	return left + right;
}

int main()
{
	int ret = Add(1, 2);

	return 0;
}

在这里插入图片描述
可以看到,在C语言中,如果不使用宏的话,是需要调用(call)函数的;再来看看C++的内联函数;
在这之前,需要先设置下属性,才能在Debug版本下查看内联函数;
在这里插入图片描述
设置完毕后,我们开始进行查看:

inline int Add(int left, int right)
{
	return left + right;
}

int main()
{
	int ret = Add(1, 2);

	return 0;
}

在这里插入图片描述
可以看到,在使用内联函数后,编译器并没有去调用函数建立栈帧,而是直接对函数进行了展开并直接得出结果;

结论:
内联函数减少了调用函数建立栈帧所需要的开销,提升了程序运行的效率;

1.3 内联函数的特性

2.inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会使用函数体替换函数调用;缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率;

优势已经了解过了,那缺陷讲的是什么呢?下面痛过一个例子来进行说明:

有一个函数,已知函数中有30行代码,目前文件中调用了该函数1万次,求该函数分别为普通函数(非内联) 与 内联函数时,程序此时代码量有多少行?
通过上面的学习,我们已经知道了:内联函数是完全展开的;也就是说,在1万次调用的地方,函数的代码量就要多增加1万 * 30行,也就是30万行代码量;再来看看普通函数调用:由于不是内联函数,也就不需要展开,函数只需要存在一份即可,那么其总代码量就为:1万+ 30行;

通过上面的例子,可以看到,当调用内联函数过多时,程序的代码量就会变多;当代码量越多时,文件就会越大;这就是内联函数的缺点;
注意: 编译器一般会忽略掉30行代码的内联函数的特性,这里仅仅是举个例子;

2.inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
这个特性可以自己下去进行试验,内联函数一般都只有10行以内的代码量;

3.inline不建议声明和定义分离,分离会导致链接错误。 因为inline被展开,就没有函数地址了,链接就会找不到;
下面一步一步的详细讲解:
我们先创建3个文件,分别为:Add.h 、 Add.cpp、 test.cpp
先来看看普通函数是怎么实现的:

//Add.h
#pragma once
#include<iostream>
using namespace std;

int Add(int left, int right);


//Add.cpp
#include"Add.h"

int Add(int left, int right)
{
	return left + right;
}


//test.cpp
#include"Add.h"

int main()
{
	int ret = Add(1, 2);

	return 0;
}

1.文件进行预处理:将头文件进行展开;
2.文件进行编译:生成函数符号:由函数名 + 函数地址组成
3.文件进行汇编:生成符号表,汇编指令转为机器码;
4.文件进行链接:在进行链接时,test.cpp文件中不存在Add函数,那么就会去符号表中寻找,如果找不到就会报链接错误;
在这里插入图片描述
如果使用内联函数,就会报链接错误,这是为什么呢?根据上述过程我们可以看到在编译阶段就会形成符号,由于有函数声明,在编译期间找不到函数,程序不会立即报错,而会在链接时去符号表中找,找不到就会报链接错误; 内联函数声明和定义分离的错误就出现在符号表上!当你使用inline关键字后,无论编译器是否允许该函数为内联,该函数都无法进入符号表中,所以如果使用该函数时,本文件只有函数声明,却没有函数定义,就会在链接时找不到该函数而报链接错误;

最后

以上就是孝顺八宝粥为你收集整理的C++ —— 内联函数1.内联函数的全部内容,希望文章能够帮你解决C++ —— 内联函数1.内联函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部