【C++】内联函数

这篇具有很好参考价值的文章主要介绍了【C++】内联函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在C语言中,我们学习过宏的用法。宏通常被用于进行简单的文本替换来执行一系列的操作,比如一些简单的运算。使用宏可以避免函数调用时建立栈帧的开销,提高程序的性能。我们首先来写一个实现加法功能的宏:

#define ADD(x, y) ((x) + (y))
int main()
{
	int a = 10;
	int b = 20;
	cout << ADD(10, 20) << endl;

	return 0;
}

这个宏完美实现了我们的加法需求,但在定义宏时需要格外小心,因为宏可能存在潜在的问题,如副作用和作用域。为确保宏替换后的正确性,可能需要加上多个括号,这样就比较繁琐。而且宏无法进行类型检查,因为它只是完成替换功能。为了解决这些问题,C++引入了内联函数,提供了一种更安全、清晰且性能保持良好的替代方案。


概念

用 inline 修饰的函数叫做内联函数,编译时C++编译器会视情况在调用内联函数的地方展开,此时同样没有函数调用建立栈帧的开销,因此可以提升程序运行的效率。现在我们将上面定义的宏改写成内联函数:

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

int main()
{
	int a = 10;
	int b = 20;
	int ret1 = Add(10, 20);

	return 0;
}

写成内联函数后,我们就不需要像定义宏一样注意括号的细节了。我们转到反汇编来看一下: 

【C++】内联函数,c++,开发语言

我们发现它并没有展开,而是和普通的函数调用一样,也建立了栈帧,因为这里依旧有 call 指令,原因是在 debug 模式下需要手动对编译器进行设置才能展开,而 release 模式下则不需要,但是 release 模式下无法调试,我们也无法看到展开的效果,因此接下来我们先设置下编译器。 

【C++】内联函数,c++,开发语言

右键单击箭头指向的这个位置。

【C++】内联函数,c++,开发语言

如图所示,选择程序数据库这一选项。

【C++】内联函数,c++,开发语言

内联函数扩展这里选择只适用于 _inline 这一选项,然后点击确定,这样就设置好了。这时候我们在调试一次,转到反汇编来看:

【C++】内联函数,c++,开发语言

可以看到 call 指令已经没有了,函数确实是直接展开了。并且内联函数下我们依旧可以对程序进行调试。这里有一个小细节,mov 指令是先针对左操作数也就是10的,而对于普通的函数调用,在建立栈帧时先压入栈中的是右操作数,如果不清楚的话可以往上回顾一下没展开的那段汇编代码。我们再来看看宏的汇编代码:

【C++】内联函数,c++,开发语言

显而易见宏是不一样的,因为它是直接进行替换的。宏替换后只有这样这样一句语句,显然无法进行调试。 


特性

1. 内联是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段就会用函数体替换函数调用。这样可以省去调用函数的开销,提高程序的运行效率。但是事物总是具有两面性的,内联函数也会存在缺陷,如可能会使目标文件变大,就算内联函数本身很短,但是在调用了很多次的情况下会有很多次的展开,总代码行数就会变长了。

2. 内联对于编译器而言只是一个建议,是否采纳这个建议的决定权在于编译器。不同编译器关于内联的实现机制可能不同。一般建议将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现,一般10行左右是一个界限)、不是递归、且频繁调用的函数采用 inline 修饰,否则编译器会忽略内联建议。不可能把一个100行代码的函数当成内联对吧,否则多次调用的情况下目标文件岂不是非常的大。

3. 建议不要将内联函数的声明和定义分离,这样可以避免其他源文件在使用该函数时发生链接错误。由于内联函数在调用时会直接被展开,其函数地址不会进入符号表,导致在链接阶段无法找到该函数的地址。因此,如果一定要将内联函数的声明和定义分开,那么该内联函数只能在包含其定义的源文件中使用。


潜在面试问题

宏的优缺点:

优点:
1.
提高代码的复用性,通过简单的文本替换实现通用功能。
2. 在一些情况下,宏能够
提高程序的性能

缺点:
1. 宏
不便于调试,因为宏在预编译阶段就进行了替换,因此难以在调试中观察。
2. 可能导
致代码可读性和可维护性下降,并且容易被误用。
3.
缺乏类型安全的检查,可能导致错误的使用。

C++中用什么替代宏:

1. 常量的定义可以使用 const 或 enum 来替代宏,提高类型安全和可读性。
2. 短小函数的定义可以
使用内联函数来替代宏,这样不仅保障了性能,还避免了宏可能引入的潜在问题,并提高了代码的可维护性。文章来源地址https://www.toymoban.com/news/detail-799590.html

到了这里,关于【C++】内联函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++内联函数】

    假设有这样的一个场景,有一个代码量不足三行的函数被调用了一万次,现在让你做优化,你会怎么考虑优化? 我们都知道函数调用是有时间和空间开销的。程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能

    2023年04月26日
    浏览(61)
  • C++内联函数详解

    目录 如何定义内联函数? 内联函数的优势 内联函数的缺点 内联函数的使用场景 示例代码 总结 在C++中,内联函数是一种特殊的函数,它的作用是在程序编译时将函数的代码直接嵌入到调用该函数的代码中,从而避免了函数调用的开销。这种方式可以提高程序的执行效率,适

    2023年04月20日
    浏览(24)
  • 【C++】内联函数

    在C语言中,我们学习过宏的用法。宏通常被用于 进行简单的文本替换 来执行一系列的操作,比如一些简单的运算。使用宏可以 避免函数调用时建立栈帧的开销 ,提高程序的性能。我们首先来写一个实现加法功能的宏: 这个宏完美实现了我们的加法需求,但在定义宏时需要

    2024年01月18日
    浏览(22)
  • 『C++成长记』C++入门——内联函数

     🔥 博客主页: 小王又困了 📚 系列专栏: C++ 🌟 人之为学,不日近则日退  ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、内联函数 📒1.1内联函数的概念 📒1.2内联函数的特征 二、auto 📒2.1auto简介 📒2.2auto使用规则 📒2.3auto无法使用的场景 三、基于范围的for循

    2024年02月05日
    浏览(29)
  • 【C++入门】内联函数的秘密

    inline 修饰的函数叫内联函数,编译后会在调用内联函数的地方展开,没有调用函数的开销,可以提高程序运行的效率。 例子: 但是 inline 只是给编译器的一个建议,编译器自己会决定内联函数是否在调用处展开。 内联函数展开是一种空间换时间的做法,可能会造成代码膨胀

    2024年02月12日
    浏览(23)
  • 【C++】初阶 --- 内联函数(inline)

    🥰 用C语言先来实现普通的Add函数看一下 👇 转到反汇编来看一下: 可以看到,编译器为了实现一个简单的相加函数,Add函数体内需要执行的汇编指令要很多,而且为了调用函数还要执行指令跳转 (并且要在栈区上为函数开辟栈帧空间) ,如果 Add函数被重复大量地使用,则会

    2024年02月14日
    浏览(23)
  • C++:命名空间,缺省参数,函数重载,引用,内联函数

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C++》 本篇博客作为C++知识总结,我们来认识命名空间,缺省参数,函数重载,引用,内联函数。 那么在介绍命名空间时,我们先用C++的方式打印\\\"hello world\\\"。 其中,using namespace std; 就是一种命名空间的使用。 在

    2024年02月11日
    浏览(30)
  • 【C++】内联函数与快速读入read函数(整型)

    在学习C++的过程中,在很多的题解中都发现了利用read来实现快速读入的功能,今天,我们就来学习一下快速读入这个函数,并顺带着学习一下内联函数 在学习read函数之前,我们先来学习一下内联函数 我们都知道,函数在分类上可以分为 主调函数和被调函数 ,main函数就是主

    2024年02月10日
    浏览(25)
  • 【C++】内联函数----inline函数的详细使用教程

    🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己, 强大自己才是核心 。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天

    2024年02月04日
    浏览(37)
  • C++从入门到精通——内联函数

    内联函数是一种优化手段,通过在编译时将函数调用替换为函数体本身的复制品,以减少函数调用的开销。它适用于函数体较小、调用频繁的情况。使用内联函数可以提高程序执行效率,但也会增加最终生成的代码大小。在C++中,可以使用 inline 声明内联函数。然而,

    2024年04月10日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包