当前位置: 首页 > news >正文

函数参数缺省和内联函数【C++】

文章目录

  • 函数参数缺省
    • 函数参数缺省的条件和要求
  • 内联函数
    • 内联函数的工作原理
    • 内联函数的定义方法
    • 内联函数的要求
      • 解决方法:直接在.h中定义内联函数的函数体
    • 内联函数再Debug模式下默认是不展开的

函数参数缺省

顾名思义:可以少传一个/多个参数给函数,但是该函数还能正常运行

在这里插入图片描述

不像C语言中函数定义了几个参数就必须传几个参数函数才能工作


函数参数缺省的条件和要求

  1. 必须在声明或者定义时给形参一个默认值

    在这里插入图片描述
    这样函数在参数缺省的时候就可以用形参的默认值工作,再有参数传入时,从左往右把默认值覆盖

  2. 给函数的形参默认值时必须从右往左给【即右边的有默认值了,才能给左边的形参默认值

    这样可以
    在这里插入图片描述
    但是这样不行
    在这里插入图片描述
    为什么呢?
    因为函数形参接收参数是从左往右接收的,所以左边的形参先接收到参数,如果少传了参数,参数就会被左边的形参数接收完毕,此时如果右边的形参没有默认值,函数就工作不了了

  3. 给函数默认值时不能跳着给
    在这里插入图片描述

  4. 函数给默认值时,如果函数有声明就必须在声明时给默认值定义时不能再给

    在这里插入图片描述


内联函数

内联函数是用空间换取时间的函数

注意:内联函数是程序员对编译器的建议

如果程序员设定的内联函数的函数体太长,编译器就可能不会将它作为内联函数,还是将它视为普通函数


内联函数的工作原理

①把函数实现放在代码区,不放在栈区
即把函数的函数体展开在代码里,有点类似宏函数的展开

②把函数时间放在了代码区,就不用传参
去掉了传参的时间。
也省去了操作系统给栈区函数的形参分配值的时间。

③不放在栈区实现,操作系统就不用销毁回收空间,去掉了操作系统回收空间的时间。


内联函数的定义方法

直接在函数定义//声明的返回值前+一个关键字inline
即可

在这里插入图片描述

内联函数的调用方法和普通函数一样


内联函数的要求

  • 函数体不能太长,代码不能太多

为什么?
假设一个内联函数的函数体为100行代码
它会被调用100000次,每一次调用都会展开一次函数体到代码区去
那么它就会在代码区展开出100000*100行代码,会有很多重复的代码

而且这些代码都会被存在最终的可执行程序中,导致可执行程序的大小变大

而此时如果不用内联,那存入可执行程序的代码就只有100000+100行代码

其中100000行代码都是调用该函数的代码,100行代码是该函数的函数体

因为普通函数的函数体在栈中,每次调用时都会开辟栈区空间,再栈区空间中执行函数体,每次调用函数都是重复使用那函数的100代码

  • 函数体里面不能有递归调用

因为内联函数每次调用都要在调用位置展开内联函数的函数体
编译器不知道递归什么时候能结束,就不知道会展开多少次,所以编译器不会接受把递归函数做内联函数

  • 内联函数声明和定义不能分离在不同文件中在同一文件中可以

    普通函数是可以分离的
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

内联函数不能分离
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

为什么呢?

因为内联函数是不进编译链接时的符号表的,也没有地址

所以链接时找不到


解决方法:直接在.h中定义内联函数的函数体

因为被包含的头文件会在预处理时展开,所以包含了头文件的文件就内使用该头文件中定义的东西
(不了解编译和链接的可以看我这篇文章:c语言编译和链接)


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


内联函数再Debug模式下默认是不展开的

因为展开了就和宏一样不方便调试

相关文章:

函数参数缺省和内联函数【C++】

文章目录 函数参数缺省函数参数缺省的条件和要求 内联函数内联函数的工作原理内联函数的定义方法内联函数的要求解决方法:直接在.h中定义内联函数的函数体 内联函数再Debug模式下默认是不展开的 函数参数缺省 顾名思义:可以少传一个/多个参数给函数&…...

javaWeb城市公交查询系统的设计与实现

一、选题背景 随着低碳生活的普及,人们更倾向于低碳环保的出行方式,完善公交系统无疑具有重要意义。公交是居民日常生活中最常使用的交通工具之一,伴随着我国经济繁荣和城市人口增长,出行工具的选择也变得越来越重要。政府在公共…...

企业案例:金蝶云星空对接旺店通·企业版

某知名化妆品企业,主要专注于化妆品,护肤品等研发,销售,生产于一体化的企业。企业的业务模式涉及比较广,有2B,2C和国内外电商领域。由于对内部业务流程的连贯性和数据的准确性比较关注。财务系统用的金蝶云星空&#x…...

wpsword求和操作教程

wpsword求和怎么操作: 1、首先,单纯的数据是无法求和的,所以我们必须要“插入”一个“表格” 2、接着将需要求和的数据填入到表格中。 3、填完后,进入“布局”选项卡。 4、然后打开其中的“公式” 5、在其中选择求和公式“SUM”并…...

Android 手机部署whisper 模型

Whisper 是什么? “Whisper” 是一个由OpenAI开发的开源深度学习模型,专门用于语音识别任务。这个模型能够将语音转换成文本,支持多种语言,并且在处理不同的口音、环境噪音以及跨语言的语音识别方面表现出色。Whisper模型的目标是提供一个高效、准确的工具,以支持自动字幕…...

通信术语:初学者入门指南(二)

1.SAR:Synthetic Aperture Radar合成孔径雷达,是一种雷达系统,通常用于地球或行星的遥感成像。相较于传统的实孔径雷达,SAR 通过在相对较长的时间内,对来自同一地点的多个雷达反射信号进行综合处理,实现了更…...

Java中使用MQTT客户端库实现TLS/SSL加密通信的示例

以下是一个完整的Java代码示例,展示了如何使用Eclipse Paho MQTT客户端库在Java中实现TLS/SSL加密的MQTT通信。在这个示例中,我们将创建一个简单的MQTT客户端,该客户端连接到支持TLS/SSL的MQTT代理,并发布和订阅消息。 首先&…...

【m122】webrtc的比较

uint16的比较IsNewerSequenceNumber 和 u32的比较LatestTimestamp G:\CDN\WEBRTC-DEV\libwebrtc_build\src\modules\include\module_common_types_public.h/** Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.** Use of this source code is governed …...

axios发送get请求但参数中有数组导致请求路径多出了“[]“的处理办法

一、情况 使用axios发送get请求携带了数组参数时,请求路径中就会多出[]字符,而在后端也会报错 二、解决办法 1、安装qs 当前项目的命令行中安装 npm install qs2、引入qs库(使用qs库来将参数对象转换为字符串) // 全局 import qs from qs Vue.proto…...

vue3的mars3d点击右键出现置顶、向下、向上等选项

效果图 下载插件 imengyu/vue3-context-menu npm i imengyu/vue3-context-menu在要使用的页面中引入一下代码 import "imengyu/vue3-context-menu/lib/vue3-context-menu.css"; import ContextMenu from "imengyu/vue3-context-menu";如果是使用在树的…...

MySQL进阶-----SQL提示与覆盖索引

目录 前言 一、SQL提示 1.数据准备 2. SQL的自我选择 3.SQL提示 二、覆盖索引 前言 MySQL进阶篇的索引部分基本上要结束了,这里就剩下SQL提示、覆盖索引、前缀索引以及单例联合索引的内容。那本期的话我们就先讲解SQL提示和覆盖索引先,剩下的内容就…...

机器学习模型之K近邻

K近邻(K-Nearest Neighbors,KNN)是一种基本的机器学习算法,它既可以用于分类问题,也可以用于回归问题。KNN算法的核心思想非常简单:一个新样本的分类或回归值取决于它与训练集中最相似的K个样本的多数类别或…...

强化基础-Java-泛型基础

什么是泛型? 泛型其实就参数化类型,也就是说这个类型类似一个变量是可变的。 为什么会有泛型? 在没有泛型之前,java中是通过Object来实现泛型的功能。但是这样做有下面两个缺陷: 1 获取值的时候必须进行强转 2 没有…...

c++20协程详解(一)

前言 本文是c协程第一篇,主要是让大家对协程的定义,以及协程的执行流有一个初步的认识,后面还会出两篇对协程的高阶封装。 在开始正式开始协程之前,请务必记住,c协程 不是挂起当前协程,转而执行其他协程&a…...

go: go.mod file not found in current directory or any parent directory.如何解决?

这个错误表明你正在执行 go get 命令&#xff0c;但是当前目录或任何父目录中都找不到 go.mod 文件。这可能是因为你的项目还没有使用 Go Modules 进行管理。 要解决这个问题&#xff0c;有几种方法&#xff1a; go mod init <module-name> 其中 <module-name>…...

Go-Gin全局错误处理中间件

为了防止报错引起Gin服务挂掉以及错误日志记录&#xff0c;我们使用全局错误中间件进行管理。 package middlewareimport ("ToDoList/global""github.com/gin-gonic/gin""go.uber.org/zap""net""net/http""net/http/h…...

图神经网络实战(6)——使用PyTorch构建图神经网络

图神经网络实战&#xff08;6&#xff09;——使用PyTorch构建图神经网络 0. 前言1. 传统机器学习与人工智能2. 人工神经网络基础2.1 人工神经网络组成2.2 神经网络的训练 3. 图神经网络4. 使用香草神经网络执行节点分类4.1 数据集构建4.2 模型构建4.3 模型训练 5. 实现香草图神…...

【Flutter】windows环境配置

windows 11 环境 官方教程 配置了flutter 环境变量在系统的path里 bin 路径。 死活没反应 关闭了git关闭了dart.exe关闭了vs还是不行卸载重新来 新版git flutter doctor 还需要android 环境...

毕马威:《智慧之眼:开启汽车感知新时代》

在全球科技飞速发展和产业革新的大潮中&#xff0c;汽车产业正在以前所未有的速度向网联化、智能化的方向转型。汽车传感器作为智能联网汽车发展的关键环节之一&#xff0c;扮演着举足轻重的角色。 毕马威一直关注汽车产业的变化与发展&#xff0c;为了更好地为汽车行业赋能&a…...

每日三个JAVA经典面试题(三十四)

1.Mybatis的一级、二级缓存 MyBatis提供了两种缓存机制来提高查询效率&#xff1a;一级缓存和二级缓存。 一级缓存&#xff08;Session级别&#xff09; 作用范围&#xff1a;一级缓存是基于SqlSession的。这意味着&#xff0c;如果你在同一个SqlSession中执行两次相同的查询…...

从轨迹到网络:广州休闲步行空间格局刻画 | 论文全解析与方法论深度拆解

从轨迹到网络:广州休闲步行空间格局刻画 | 论文全解析与方法论拆解 原文:From trajectories to network: Delineating the spatial pattern of recreational walking in Guangzhou》 一、论文核心概览:摘要与关键词 1.1 核心摘要解析 本文的核心内容可拆解为5个核心模块,…...

基于Python的项目申报系统毕设源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于Python的项目申报系统&#xff0c;以满足现代项目管理中对项目申报流程的自动化、高效化和规范化的需求。具体研究目的如下&#x…...

从随机采样到精准决策:蒙特卡罗方法在复杂系统建模中的实践

1. 蒙特卡罗方法&#xff1a;用随机性破解复杂世界的密码 想象你是一位古代数学家&#xff0c;手里只有一把沙子和一块画着方格的石板。现在要计算一个不规则形状的湖泊面积&#xff0c;你会怎么做&#xff1f;最原始的方法可能是把沙子均匀撒在石板上&#xff0c;然后数出落在…...

腾讯游戏卡顿终极解决方案:ACE-Guard资源限制器完整指南

腾讯游戏卡顿终极解决方案&#xff1a;ACE-Guard资源限制器完整指南 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源&#xff0c;支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 你是否在玩《地下城与勇士》、《英雄…...

开源AI助手竟能自主建频道、做视频?李宏毅深度解析“小龙虾”的神秘工作原理!

最近全网爆火的「养龙虾」到底是什么&#xff1f;为什么一个开源的 AI 助理项目&#xff0c;能让 AI 自己创建 YouTube 频道、自己做教学视频、24 小时自主干活&#xff1f; 台大李宏毅老师的这堂《解剖小龙虾 — 以 OpenClaw 为例介绍 AI Agent 的运作原理》&#xff0c;用最通…...

RGBLEDBlender:嵌入式RGB LED色彩混合与动态控制框架

1. RGBLEDBlender 库深度解析&#xff1a;面向嵌入式系统的 RGB 色彩混合与动态控制框架RGBLEDBlender 是一个轻量级、面向硬件的 RGB LED 色彩混合库&#xff0c;专为资源受限的微控制器平台&#xff08;尤其是 Arduino 生态&#xff09;设计。该库由 Erik Sikich 于 2016 年 …...

Flink技术实践-超时异常踩坑与优化

一、背景介绍在Flink实时计算的生产环境中&#xff0c;最令人头疼的往往不是复杂的业务逻辑&#xff0c;而是那些突如其来的“超时异常”。这些异常就像是系统中的“幽灵”&#xff0c;通常在业务高峰期或网络抖动时出现&#xff0c;导致作业重启、数据延迟甚至数据丢失。最近几…...

trt 动态batchsize优化:trtexec工具ONNX转engine实战指南

1. 为什么需要动态batchsize优化 在实际的AI模型部署中&#xff0c;我们经常会遇到输入数据量不固定的情况。比如视频分析场景&#xff0c;可能同时有1路或8路视频需要实时处理&#xff1b;又比如在线服务&#xff0c;请求量会随时间波动。这时候如果使用固定batchsize&#xf…...

PLCopen运动控制功能块实战:从单轴控制到多轴联动的5个经典案例解析

PLCopen运动控制功能块实战&#xff1a;从单轴控制到多轴联动的5个经典案例解析 在工业自动化领域&#xff0c;精确的运动控制是实现高效生产的关键。无论是简单的传送带定位&#xff0c;还是复杂的多轴协同作业&#xff0c;PLCopen规范提供的标准化功能块都能为工程师提供强大…...

Vue3项目救星:我是如何用Cursor的‘项目规则’功能,让团队新人一天上手的

Vue3团队协作革命&#xff1a;用Cursor项目规则实现代码规范的自动化治理 当新成员加入你的Vue3项目时&#xff0c;是否经历过这样的场景&#xff1f;新人提交的代码里混杂着选项式API和组合式API&#xff0c;路由命名忽而短横线忽而大驼峰&#xff0c;样式文件里散落着各种魔…...