【C++初阶】:内联函数

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

一.宏函数

在c语言中,如果一个函数较短并且会被重复使用,那么我们就可以把该函数换成一个宏函数。

【C++初阶】:内联函数

【C++初阶】:内联函数

贴个小知识,宏函数有许多的坑也是面试官喜欢考的点,如果对行函数不太了解可以看看这篇关于宏的部分传送门

宏函数的优点:不会建立栈帧,提高使用效率。
宏函数的缺点:复杂,可读性差,不能调试。

为了解决宏函数的种种缺陷,c++推出了一个新的语法内联函数(inline)。

二.内联函数

内联函数的创建非常简单,只需要在普通的函数前面加上一个inline就可以了。

【C++初阶】:内联函数

内联函数成功的解决了宏函数的种种问题,它的可读性强,不需要建立栈帧,简单并且可以调试。

既然内联函数优点这么多,那么可不可以把所有函数都改成内联函数呢?

答案是不可以。

内联函数跟宏函数一样都只适用于短小并且重复使用的函数。如果函数过长,会出现一个问题-代码膨胀。因为内联函数的本质就是展开:如果一个函数有50行代码并且会被调用10000次。那么如果该函数不是内联函数,编译器总共会执行指令10000+50=10050次;如果该函数是内联函数,那么编译器会执行指令10000*50=500000次。

如果在工程里出现了以上的问题,会造成什么后果呢?答案是会造成你的程序或者安装包的内存占用变大,如果同一个程序别人几百个MB就能完成,你的却需要好几个G,那很明显是不符合客户需求的。

三,是否成为内联函数

为了防止内敛函数被乱用,编译器自己有一套判断方法。

【C++初阶】:内联函数

接下来,我们来测试一下,这个函数会不会变成内联。

【C++初阶】:内联函数

【C++初阶】:内联函数

这个函数短小并且被重复调用,按理说编译器应该支持内联,但这里很明显并没有(注意call指令出现就是一个明显的调用函数指令,说明该函数并未展开)。这是因为我编译器现在处于默认的Debug版本,在该版本下内联函数不会展开,否则不易调试。需要转到release版本,内联函数才会展开。

【C++初阶】:内联函数

插个小知识,调试也是写程序非常重要的一环,如果不太了解可以看看这篇vs调试技巧

总结

【C++初阶】:内联函数

四.内联函数的跨文件使用

在工程项目中,一直都是进行模块化编程,如果我像其他函数一样声明会出现什么问题呢?

【C++初阶】:内联函数

【C++初阶】:内联函数

【C++初阶】:内联函数
【C++初阶】:内联函数

我们在Add.cpp里定义,在Add.h里声明,在Test.cpp里使用,如果普通函数是不会有问题的,但是内联函数就会出现问题,并且报错是无法解析的外部符号,这也是标准的链接错误。

为什么会出现这种报错呢?这是因为内联函数不会进入符号表,也就是不会产生地址。而编译器在链接到Add.h里时,发现了Add函数的声明,自动生成了一个地址,但在Add.cpp里时,Add函数已经展开,不再有地址,所以编译器拿着这个地址但早不到定义,自然也就是无法解析。

内联函数跨文件应该如下写:

【C++初阶】:内联函数

直接在Add.h里面定义,那么它就会像其它头文件时,在使用时自动展开啦。文章来源地址https://www.toymoban.com/news/detail-424943.html

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

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

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

相关文章

  • 【C++初阶】C++基础(下)——引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr

      目录 1. 引用 1.1 引用概念 1.2 引用特性 1.3 常引用 1.4 使用场景 1.5 传值、传引用效率比较 1.6 引用和指针的区别 2. 内联函数 2.1 概念 2.2 特性 3.auto(C++11) 3.1 类型别名思考 3.2 auto简介 3.3 auto的使用细则 3.4 auto不能推导的场景 4. 基于范围的for循环(C++11) 4.1 

    2024年02月15日
    浏览(53)
  • 【C++初阶】二、入门知识讲解(引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】一、入门知识讲解 (C++、命名空间、C++输入输出、缺省参数、函数重载)-

    2024年02月04日
    浏览(45)
  • 【C++】函数重载 & 引用 & 内联函数

    目录 一,函数重载 1,函数重载的概念 2,C++支持函数重载的原理 二,引用 1,引用概念 2,引用特性 3,常引用 4,做参数 5,做返回值 6,传值、传引用效率比较 7,值和引用的作为返回值类型的性能比较 8,引用和指针的区别 三,内联函数 1,概念 2,特性 自然语言中,一个

    2024年02月08日
    浏览(26)
  • 【C++入门】内联函数

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】 内联函数概念: 内联函数就是以inline修饰的函数叫做内联函数,编译时会在调用内联函数的地方展开,没有函数调用占用建立栈帧的开销。 我们知道函数的

    2024年02月01日
    浏览(32)
  • 【C++】内联函数 ( 概念简介 )

    \\\" 内联函数 \\\" 是 C++ 语言中的一种特殊函数 , 其目的是为了提高程序的执行效率 ; 在 C++ 中 , 定义常量 可以替换 C 语言中的 宏定义 使用 常量 可以 替代 宏定义 ; 宏定义分为两种 , 一种是 宏常数 , 另外一种是 宏代码片段 ; C++ 中使用 常量 替代 宏常数 ; C++ 中用于 替代 宏代码片

    2024年02月10日
    浏览(21)
  • 【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)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包