【C++】简单理解内联函数

news2024/11/18 8:36:22

内联函数

  • 1.内联函数的概念
  • 2.C++为什么要有内联函数?
  • 3.内联函数展示
    • 3.1查看方式
    • 3.2 观察汇编代码
  • 4.使用内联函数的注意事项
  • 5.内联函数缺点和优点

1.内联函数的概念

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

2.C++为什么要有内联函数?

在C语言中,宏函数也无需创建函数栈帧,而是在预处理阶段将写好的宏函数进行代码的直接替换。但是这种的直接替换虽然可以提高代码的复用性和性能,也会造成一些缺点。
比如:
1.不方便调试宏。
2.导致代码可读性差,可维护性差,容易误用。
3.没有类型安全的检查。

所以C++为了弥补这些缺点,就开创了内联函数。

3.内联函数展示

要使用内联函数,在函数的名字定义前加上inline即可

#include <iostream>

using namespace std;

inline int ADD(int x, int y)
{
	return x + y;
}
int main()
{
	int tmp = 0;
	tmp = ADD(3, 2);
	return 0;
}

3.1查看方式

  1. 在release模式下,查看编译器生成的汇编代码中是否存在call Add
  2. 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2019的设置方式)

1.选择调试属性
在这里插入图片描述
2.在常规里面选择调试信息格式-程序数据库
在这里插入图片描述

3.然后优化->选择内联函数扩展->选择只适用于_inline(/Ob1)
在这里插入图片描述

3.2 观察汇编代码

我们先来看看debug下,没有优化后前的汇编代码

在这里插入图片描述

这条call指令说明创建了函数栈帧。

我们再来看看优化后的汇编代码

在这里插入图片描述

可以看到,使用内联函数优化后,并没有调用函数,而是像宏一样直接展开了。

4.使用内联函数的注意事项

程序员请求将函数作为内联函数时,编译器并不一定会满足要求。它可能认为该函数过大或注意到函数调用了自己(内联函数不能递归),因此不将其作为内联参数;而有些编译器没有启用或实现这些特性。

5.内联函数缺点和优点

通过注意事项我们可以知道,当函数的代码函数过多时,编译器可以会忽略程序员的请求。
这就说明内联函数的缺点是:可能会使目标文件过大
优点就是:
1.少了调用函数的开销,提高程序运行效率。
2.相比于宏,也便于调试。
3.写代码方便,避免了宏的一些易错情况

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

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

相关文章

九龙证券|沪指收获2010年以来最强1月 北向资金净买入额刷新历史纪录

昨日&#xff0c;A股小幅调整&#xff0c;2023年1月行情随之收官。全体来看&#xff0c;1月A股商场拾级而上&#xff0c;盘面出现普涨格局&#xff0c;价值与生长风格均有亮眼体现。三大股指中&#xff0c;上证指数1月上涨5.39%&#xff0c;创2010年以来最佳局面。深证成指、创…

zookeeper 源码分享二 ----启动加载数据

单机zookeeper 启动加载数据 读取磁盘中快照文件&#xff0c;选择其中第一个能正确加载的文件&#xff0c;最多加载100个快照文件。反序列化快照文件&#xff0c;进行内存DataTree数据加载根据最新事物日志&#xff0c;加载事物日志快照并进行反序列化重新执行事物日志中的操作…

OAuth2流程演示示例

目录一、OAuth2流程演示示例1、创建项目结构①客户②认证服务器③资源拥有者④资源服务器2、流程①资源所有者②客户③客户④认证服务器⑤客户⑥资源服务器一、OAuth2流程演示示例 client 客户 authorization-server 认证服务 resource-owner 资源所有者 resource-server 资源服…

anaconda下载安装,镜像源配置修改及虚拟环境的创建

anaconda安装Anaconda 简介Anaconda 安装1.安装流程2.anaconda 配置修改3. 创建虚拟环境4.常用命令Anaconda 简介 Anaconda&#xff08;官方网站&#xff09;就是可以便捷获取包且对包能够进行管理&#xff0c;同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python…

Cocos Creator游戏项目环境搭建和启动

背景获得了一套cocos creator2.4.2编写的游戏源码&#xff0c;需要在本地启动&#xff0c;查看一下是否符合预期要求。所以需要在本地搭建Cocos Creator环境&#xff0c;因为以前没有接触过&#xff0c;经过一番搜索&#xff0c;终于将环境搭建完成&#xff0c;为了备忘&#x…

【Sciter】Sciter 结合 Preact 封装 图片查看器总结

使用 react 结合 sciter 封装 图片查看器 组件 # 效果图 1、图片:宽度大于高度 2、图片:宽度小于高度 # 如何使用 <div class="container"></div

录音软件哪个好?分享两款免费实用的录音软件

有时候我们需要一款录音软件&#xff0c;来录制电脑内部的声音或者电脑外部的声音。比如录制网上无法下载的音乐、录制自己唱歌的声音、录制音频会议等等。那有没有既实用并且试用版就能录音软件呢&#xff1f;当然有&#xff01;小编今天就给大家介绍两款高性价比的录音软件&a…

Nhanes临床数据库挖掘教程2—非正态数据的基线表绘制(2)

美国国家健康与营养调查&#xff08; NHANES, National Health and Nutrition Examination Survey&#xff09;是一项基于人群的横断面调查&#xff0c;旨在收集有关美国家庭人口健康和营养的信息。 地址为&#xff1a;https://wwwn.cdc.gov/nchs/nhanes/Default.aspx 既往我们…

VUE + .NET CORE (.net6)基于asp.net 智能仓储快递物流系统源码

一、源码描述 这是一款简洁十分美观的ASP.NETsqlserver源码&#xff0c;前端vue,框架.netcore,mvc三层架构界面十分美观&#xff0c;功能也比较全面 二、功能介绍 该源码功能十分的全面&#xff0c;具体介绍如下&#xff1a; 用户待取包裹信息可以由快递网点员直接在选择用户…

学习记录 2023/02/01

一、学习内容&#xff1a; 1、OSEK网络管理规范基础&#xff08;CAN_NM报文格式、节点跳过判断机制、网络管理策&#xff09;; 2、UDS诊断服务回顾&#xff08;功能寻址与PHY&#xff0c;CAN升级工具的使用&#xff09;&#xff1b; 二、回顾提升 1、CAN程序升级工具使用(适用…

Linux内核panic核心执行逻辑

什么是OOPSOops是美国人比较常有的口语。就是有点意外&#xff0c;吃惊&#xff0c;或突然的意思。“oops”并不是很严重.对于linux内核来说&#xff0c;Oops就意外着内核出了异常&#xff0c;此时会将产生异常时出错原因&#xff0c;CPU的状态&#xff0c;出错的指令地址、数据…

实训六:启动过程和运行级别

实训六&#xff1a;启动过程和运行级别 2017 年 4 月 16 日 今日公布 实训目标 完成本次实训&#xff0c;将能够&#xff1a; 运用Shell命令管理进程。 在图形界面下管理进程。 配置cron调度。 实训准备 一台安装RHEL6系统的计算机&#xff0c;该系统除了root账户外&…

一文读懂:下一代微服务技术Service Mesh

相信提到微服务大家一定不会陌生&#xff0c;但是说起服务网格&#xff0c;即Service Mesh&#xff0c;很多同学可能就会画大大的问号了&#xff01;话不多说先给结论&#xff1a;我们可以简单的把Service Mesh理解为网络代理&#xff0c;它可以解决传统微服务中的痛点&#xf…

进程状态与优先级

目录 进程状态&#xff1a; tracing stop&#xff1a;追踪暂停状态 Z&#xff1a;僵尸状态&#xff1a; 为什么要有僵尸进程呢&#xff1f; 孤儿进程 进程优先级&#xff1a; 其他概念&#xff1a; 进程切换&#xff1a; pc/eip 环境变量&#xff1a; PATH&#xff1a;全…

nestjs初始化项目

安装nestjs脚手架 npm i -g nestjs/cli初始化项目 nest new <project-name>说明初始化项目成功 结构说明 node_modules:项目所有的依赖src: 项目的主题test: 项目测试目录.eslintrc.js: eslint约束.gitignore: git上传忽略文件nest-cli.json: nest项目配置文件package…

《C++程序设计原理与实践》笔记 第12章 一个显示模型

本章介绍了一个显示模型(display model)&#xff08;GUI的输出部分&#xff09;&#xff0c;并给出了使用示例和基本概念&#xff0c;例如屏幕坐标、线和颜色等。 12.1 为什么需要图形&#xff1f; 我们为什么用四章的篇幅介绍图形以及一章介绍GUI&#xff1f; 图形很有用。…

通信原理笔记—基带信号的波形设计与编码

目录 引言&#xff1a; 基带传输系统的基本模型&#xff1a; 基带信号的波形设计与编码&#xff1a; 数字信号的波形设计原则&#xff1a; 基带信号的基本波形&#xff1a; 常用的二进制码型&#xff1a; 单极性不归零码&#xff1a; 双极性不归零码&#xff1a; ​编辑…

RTI Connext DDS代码生成器

0 简介RTI代码生成器Code Generator,创建用RTI ConnextDDS定义define和注册register用户数据类型所需的代码。在以下情况下&#xff0c;使用代码生成器是可选的&#xff1a;您正在使用动态类型&#xff08;请参阅RTI Connext DDS核心库用户手册[RTI ConnextDDS Core Libraries …

新来一个卷王,天天加班到12点,太让人崩溃......

在程序员职场上&#xff0c;什么样的人最让人反感呢&#xff1f; 是技术不好的人吗&#xff1f;并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗&#xff1f;也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反…

2023全网汇总PMP备考攻略(附答题技巧资料)

一&#xff0c;多复习和学习新版考纲 01《PMBOK》看三遍 这边建议看三遍《PMBOK》&#xff0c;更有利于我们巩固知识&#xff0c;查缺补漏。 第一遍 第一遍是老师带着我们去看。这个时候一定要非常专心&#xff0c;千万不要上课走神或者玩手机。因为这一遍老师会告诉我们&a…