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

news2024/11/16 2:27:32

内联函数

  • 一.宏函数
  • 二.内联函数
  • 三,是否成为内联函数
  • 四.内联函数的跨文件使用

一.宏函数

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

在这里插入图片描述

在这里插入图片描述

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

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

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

二.内联函数

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

在这里插入图片描述

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

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

答案是不可以。

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

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

三,是否成为内联函数

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

总结

在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

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

在这里插入图片描述

直接在Add.h里面定义,那么它就会像其它头文件时,在使用时自动展开啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/456221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用美颜SDK制作美妆相机?美颜SDK代码分析

随着时代的发展,人们对于自己的外貌要求越来越高,因此美颜相机、美妆相机等软件也逐渐兴起。其中,美妆相机是一种可以实现“快速上妆效果”的美颜工具,而美颜SDK则是实现美妆相机的核心技术之一。本文将介绍如何使用美颜SDK制作美…

你怎么看 App响应时间优化这事?

作者:xuexiangjys 响应时间,它是用来衡量系统运行效率的一个重要指标。评价一个应用的响应时间,可以从用户感知和系统性能这两个角度来考量。 响应时间的长短,可能影响用户对某个功能、某个应用、乃至某个系统的使用。毕竟如果有选…

VS2022配置OpenGL+GLAD

Glew(The OpenGL Extension Wrangler Library)是对底层OpenGL接口的封装,可以让你的代码跨平台。Glad与Glew作用相同,可以看作它的升级版。 Freeglut(OpenGL Utility Toolkit)主要用于创建并管理窗口和Ope…

Windows逆向安全(一)之基础知识(十五)

指针二 先前介绍了指针的一些基本的知识,但都没有提到地址的概念,下面承接之前的笔记,继续学习指针 下面要介绍三个相关的内容:获取变量的数据类型 、 取变量地址和取地址中存储的数据 获取变量的数据类型 在C语言中可以使用下…

Sleep:预测认知能力的最佳纺锤波检测参数

导读 目的:睡眠纺锤波的改变与认知障碍有关。这一发现增加了人们对识别基于睡眠的认知和神经退行性疾病生物标志物(包括睡眠纺锤波)的兴趣。然而,围绕纺锤波定义和算法参数设置的灵活性带来了方法上的挑战。本研究的目的是描述纺锤波检测参数设置如何影…

Dynamic Slicing for Deep Neural Networks

0、摘要 程序切片已广泛应用于各种软件工程任务中。然而,现有的程序切片技术只能处理由指令和变量构建的传统程序,而不能处理由神经元和突触组成的神经网络。在本文中,我们提出了 NNSlicer,这是第一种基于数据流分析的深度神经网络…

android studio shape形状图形

1.创建shape 2定义椭圆 <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"android:shape"oval"><!--指定形状椭圆--><!--指定形状内部颜色--><…

Ubuntu与window实现文件共享——Samba使用

前言 &#xff08;1&#xff09;我们在使用Linux开发的时候&#xff0c;因为Linux中写程序没有Windows的工具方便&#xff0c;所以经常是先在windows环境下编写程序&#xff0c;之后再将文件上传给Linux进行编译。 &#xff08;2&#xff09;这样就存在一个问题&#xff0c;因为…

vue使用Howler实现音乐播放器

vue使用Howler实现音乐播放器 前言一、引入依赖二、封装组件 前言 本文使用Howler.js进行播放。使用siriwave做的播放动画具体文档地址如下 名称地址Howlerhttps://howlerjs.com/siriwavehttps://github.com/kopiro/siriwave 最后实现效果如下&#xff1a; 实现暂停、开始、…

教你如何根据需求编写测试用例,不用写一行代码,使用ChatGPT4自动完成。

首先来张效果图&#xff0c;需求我是放到requirements.txt文档里&#xff0c;输出的测试用例是放到test_case1.txt&#xff0c;整个代码我是让ChatGPT4自动给我写的。 我用的prompt提示语是&#xff1a; 我的想法是这样&#xff0c;通过Python代码&#xff0c;和API keys来实现…

传统制造企业在引入项目管理机制时项目组织结构的重要性

在传统的工业设备制造行业,针对以订单项目为驱动的业务模式,建立一套成熟完备的项目管理机制十分重要,同时也是企业提升自身管理水平精细度的内在要求。项目管理作为外企普遍应用的成熟管理模式,如何将其引入并与民企现存的传统职能型管理模式融合,实现成功嫁接,值得大家思考并…

AD9208之8通道高速采集

板卡概述 FMC168 是 一 款 基 于 VITA57.4 标 准 的2GSPS/2.6GSPS/3GSPS 采样率 14 位分辨率 Double FMC子卡模 块&#xff0c;该模块可以实现 8 路 14-bit、2GSPS/2.6GSPS/3GSPS 采样率模 拟信号采集。该板卡 ADC 器件采用 ADI 公司的 AD9208 芯片,该芯片 与 AD9689 完全…

快商通AI技术再获殊荣,荣膺厦门市“科学技术进步奖”

近日&#xff0c;快商通AI科研项目荣获厦门市“科学技术进步奖”&#xff0c;这是对快商通AI技术研究成果的高度肯定&#xff0c;也是快商通在人工智能领域的又一重大突破。 快商通作为一家技术领先的企业&#xff0c;始终坚持 核心技术自主研发 &#xff0c;致力于将自然语言…

【Linux命令行与shell脚本编程】 一,Shell简介

Linux命令行与shell脚本编程 第一章 Shell简介 目录 Linux命令行与shell脚本编程一,Shell简介1.1 终端(终端仿真器) 41.2 shell 提示符1.2.1 命令历史记录1.2.2 光标移动1.2.3 与 bash手册交互 命令的构成 一,Shell简介 1.1 终端(终端仿真器) 4 让用户访问 shell 使用图形用…

国产操作系统新机遇——小程序容器

信息技术应用创新不仅是各行各业实现数字转型的关键起点&#xff0c;而且还是我国加强网络安全和信息安全的重要手段。 现阶段&#xff0c;微软&#xff0c;谷歌和苹果等外国公司在操作系统市场上占据着几乎垄断的行业地位。国内操作系统行业正在努力改变过去过于分散的状态&a…

从FMCW毫米波雷达系统的性能参数理解4D成像毫米波雷达的设计思路

本文编辑&#xff1a;调皮哥的小助理 站在设计雷达的角度看&#xff0c;其实无论是传统的3D毫米波雷达&#xff0c;还是如今的4D毫米波成像雷达&#xff0c;其雷达系统性能参数都遵循一个原则&#xff0c;即&#xff1a; d res ⋅ v res ⋅ θ res d max ⁡ ⋅ v max ⁡ ⋅ …

全志v851s GPIO 应用程序编写

1. 查看硬件电路图SCH_Schematic1_2022-11-23 &#xff0c;查找合适的gpio 作为使用pin 在这里我们选取 GPIOH14&#xff08;注意目前开发使用这个pin 作为触摸屏的pin脚&#xff0c;需要将触摸屏connect断开&#xff09; &#xff0c;因为 可以通过排插使用杜邦线将其引出&am…

scala特质trait

目录 说明案例动态混入 说明 Scala 语言中&#xff0c;采用特质 trait&#xff08;特征&#xff09;来代替接口的概念&#xff0c;也就是说&#xff0c;多个类具有相同的特质&#xff08;特征&#xff09;时&#xff0c;就可以将这个特质&#xff08;特征&#xff09;独立出来…

rabbitMQ学习总结

RabbitMQ 生产者通过-》通道-》交换机-》投到消息队列-》再通过通道-》消费者 分布式架构 何谓分布式系统 通俗一点: 就是一个请求由服务器端的 多个服务 (服务或者系统)协同处理完成 和单体架构不同的是&#xff0c;单体架构是一个请求发起ivm调度线程(确切的是tomcat线程池)…

yolov5-fastapi-demo更换中文标签

本章是基于yolov5-fastapi-demo项目的更改 WelkinU/yolov5-fastapi-demo: FastAPI Wrapper of YOLOv5 (github.com) 首先&#xff0c;因为训练的时候设置的标签是英文&#xff0c;换成中文要重新训练&#xff0c;而且使用中文训练也很繁琐要改很多东西&#xff0c;因此可以直…