【C++】 C++入门—内联函数

C++入门

  • 1 内联函数
    • 1.1 定义
    • 1.2 查看方式
    • 1.3 注意
  • Thanks♪(・ω・)ノ谢谢阅读
  • 下一篇文章见!!!

1 内联函数

1.1 定义

在这里插入图片描述
程序在执行一个函数前需要做准备工作:要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;函数体中的代码执行完毕后还要清理,将之前压入栈中的数据都出栈,然后接着执行函数调用位置以后的代码。

在函数较大时,执行函数需要较多时间,那么函数调用的时间可以忽略不计,
但是当函数较小时(比如求和,交换等简单函数),函数调用的时间就不可以忽略了。再加上如果频繁调用,那么就会有大部分时间花在函数调用上。

而内联函数是直接把函数加入其中,免去调用的时间开销。

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。

类似于C语言中的宏展开(宏的缺陷较多)。

1.2 查看方式

查看方式:

  1. 在release模式下,查看编译器生成的汇编代码中是否存在call Add
  2. 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,以下给出 vs2022 的设置方式)
    在这里插入图片描述
    这下就可以看出内敛函数的优化了,如下:直接把函数插入 其中。
    在这里插入图片描述

1.3 注意

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。
  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:
    将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
    《C++prime》第五版关于inline的建议:
    内联说明只是向编译器发出请求,编译器可以选择忽略这个请求。
  3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

不可忽略的一点是:
代码膨胀,我们本身是1万行的主函数,如果有个 1万 行的函数,调用了100次。
使用内联函数: 结果是展开100次,我们的代码编译后就会变成100万行
不使用内联函数:函数会在栈区开辟空间,100次调用同一位置的函数,我们的代码是 2 万行
这样差距还是很大的。

Thanks♪(・ω・)ノ谢谢阅读

下一篇文章见!!!

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

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

相关文章

小米商城服务治理之客户端熔断器(Google SRE客户端熔断器)

目录 前言 一、什么是Google SRE熔断器 二、Google SRE 熔断器的工作流程: 三、客户端熔断器 (google SRE 熔断器) golang GRPC 实现 四、客户端熔断器 (google SRE 熔断器) golang GRPC单元测试 大家可以关注个人博客:xingxing – Web Developer …

【C++干货基地】C++引用与指针的区别:深入理解两者特性及选择正确应用场景

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 哈喽各位铁汁们好啊,我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的…

Log4j2-11-log4j2 Layout 布局入门介绍

Layout 布局 Appender使用Layout将LogEvent格式化为一种表单,以满足将要消费日志事件的任何需求。 在Log4j中。x和Logback布局被期望将事件转换为字符串。 在Log4j 2布局返回一个字节数组。这使得Layout的结果可以在更多类型的appender中使用。然而,这…

[机器学习]简单线性回归——最小二乘法

一.线性回归及最小二乘法概念 2.代码实现 # 0.引入依赖 import numpy as np import matplotlib.pyplot as plt# 1.导入数据 points np.genfromtxt(data.csv, delimiter,) # points[0,0]# 提取points中的两列数据,分别作为x,y x points[:, 0] y poi…

Netty源码三:NioEventLoop创建与run方法

1.入口 会调用到父类SingleThreadEventLoop的构造方法 2.SingleThreadEventLoop 继续调用父类SingleThreadEventExecutor的构造方法 3.SingleThreadEventExecutor 到这里完整的总结一下: 将线程执行器保存到每一个SingleThreadEventExcutor里面去创建了MpscQu…

ROS2 学习笔记12:使用 colcon 构建软件包

ROS2 学习笔记12:使用 colcon 构建软件包 Background 背景Prerequisites 前提1 Install colcon2 Install ROS 2 Basics 基础1 Create a workspace2 Add some sources3 Source an underlay4 Build the workspace5 Run tests6 Source the environment7 Try a demo Cre…

安卓滚动视图ScrollView

<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:orientatio…

docker镜像命令

docker images 列表本机上的镜像 - REPOSITORY&#xff1a;表示镜像的仓库源 - TAG&#xff1a;镜像的标签 - IMAGE ID&#xff1a;镜像 - ID CREATED&#xff1a;镜像创建时间 - SIZE&#xff1a;镜像大小 同一仓库源可以有多个 TAG&#xff0c;代表这个仓库源的不同个版本&am…

大洋钻探系列之七中国大洋钻探船梦想号

中国大洋钻探梦想号2021年11月30日开工建造&#xff0c;2023年12月27日在珠江口海域完成首航&#xff0c;预计2024年正式交付使用&#xff0c;从而实现了2011年中国IODP专家咨询委员会提出的我国大洋钻探发展“三步走”战略的第三步建造中国的大洋钻探船。 恰逢IODP新旧计划交替…

vue3 + vite:打包部署后,动态组件渲染404问题解决

问题描述: 当需要渲染动态组件,动态的组件路径配置在数据库中时,如下图,本地运行能正常访问,用vite打包部署后,生产上改路径为404. 起初认为是,vite打包后的文件都是.js, 当页面加载后从数据库拿来的路径是.vue, 并且是src/xxx/xxx.vue 这种绝对路径形式的,所以就找不…

unity打开外部exe,并将其置顶

直接上代码&#xff1a; 调用代码 ProcessStartInfo startinfo1 new ProcessStartInfo(); startinfo1.FileName "E:\\fastdds\\run\\" PlanType ".exe"; startinfo1.Arguments winInfo; pss Process.Start(startinfo1);//做延时的原因是window打开…

【每日一题】 2024年1月汇编

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 【1.4】2397.被列覆盖的最多行数 2397. 被列覆盖的最多行数https://leetcode.cn/problems/maximum-rows-covered-by-columns/ 这…

哪个牌子的头戴式耳机好?推荐性价比高的头戴式耳机品牌

随着科技的不断发展&#xff0c;耳机市场也呈现出百花齐放的态势&#xff0c;从高端的奢侈品牌到亲民的平价品牌&#xff0c;各种款式、功能的耳机层出不穷&#xff0c;而头戴式耳机作为其中的一员&#xff0c;凭借其优秀的音质和降噪功能&#xff0c;受到了广大用户的喜爱&…

GO EASY 框架 之 Server 06

目录 1、Overview 2、监听服务接口 3、easy/servers package 3.1、基础类Server 3.2、WWServer 服务 3.3、TcpServer 3.4、KCPServer 4、hookAgent链接钩子 5、创建一个WebScoket监听服务 1、Overview 本节主要介绍&#xff0c;easy的监听服务。例如websocket 监听&a…

Apache Commons

介绍 官网&#xff1a;https://commons.apache.org/ Apache Commons 是一个开源的 Java 项目&#xff0c;旨在提供一组通用的、可复用的 Java 组件。这些组件涵盖了多个领域&#xff0c;包括字符串操作、输入输出、集合操作、数学计算、命令行解析等。 版本 commons-lang 和 …

【面试】MySQL的几种查询方式

书读百遍&#xff0c;其意自现 文章目录 基本查询条件查询排序查询聚合查询分组查询连接查询子查询联合查询 基本查询 最简单的查询形式&#xff0c;用于选择表中的所有行或指定列的数据。例如&#xff1a; SELECT * FROM TableName; -- 选择表中所有列的所有行 SELECT Colu…

蓝桥杯算法赛第4场小白入门赛强者挑战赛

蓝桥杯算法赛第4场小白入门赛&强者挑战赛 小白1小白2小白3强者1小白4强者2小白5强者3小白6强者4强者5强者6 链接&#xff1a; 第 4 场 小白入门赛 第 4 场 强者挑战赛 小白1 直接用C内置函数即可。 #include <bits/stdc.h> using namespace std;#include <bits…

ArrayList在添加元素时报错java.lang.ArrayIndexOutOfBoundException

一、添加单个元素数组越界分析 add源码如下 public boolean add(E e) {ensureCapacityInternal(size 1); // Increments modCount!!elementData[size] e;return true; } size字段的定义 The size of the ArrayList (the number of elements it contains). ArrayList的大…

雷达DoA估计的跨行业应用--麦克风阵列声源定位(Matlab仿真)

一、概述 麦克风阵列&#xff1a; 麦克风阵列是由一定数目的声学传感器&#xff08;麦克风&#xff09;按照一定规则排列的多麦克风系统&#xff0c;而基于麦克风阵列的声源定位是指用麦克风拾取声音信号&#xff0c;通过对麦克风阵列的各路输出信号进行分析和处理&#xff0c;…

力扣hot100 跳跃游戏 贪心

Problem: 55. 跳跃游戏 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考 挨着跳&#xff0c;记录最远能到达的地方 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public boolean canJump(int[] nums)…