C++内联函数

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

为什么使用内联函数:

1.内联函数最初的目的是代替部分#define宏定义

原因:a.宏是预处理指令,在预处理的时候把所有的宏名用宏体来替换;内联函数是函数,在编译阶段把所有调用内联函数的地方把内联函数插入

        b.宏没有类型检查,无论对还是错都是直接替换;而内联函数在编译时进行安全检查

        c.宏的编写有很多限制,例如只能写一行,不能使用return控制流程等

        d.对C++而言,使用宏代码还有另一种缺点:无法操作类的私有数据成员(因为宏是在编译之前处理的,它不知道类的访问权限设置)

2.使用内联函数代替普通函数的目的是:提高程序的运行效率

原因:普通函数频繁调用的过程消耗栈空间,函数调用时要花费开辟栈区的时间和返回主函数寻址的时间;内联函数节省了开辟函数栈和寻址的时间。

如果是一个几十行的函数,函数本身执行就很耗时,那调用函数、创建栈帧(每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量,其实就是函数运行时开辟的函数栈)的一两行可以忽略不计;但是如果一个函数本身就一两行,因为调用函数本身而产生的那一部分消耗就格外突出,而宏或者内联的提前置换就显得格外优秀,提高了效率。

注意: 1.函数前面加上inline不一定会有效果,使用inline关键字修饰函数只是一种提示,编译器不一定认

         2.如果不加inline不一定不是内联函数,存在隐式内联,不用inline关键字,C++中在类内定义的所有函数都自动称为内联函数

         3.内联函数不应定会展开,要看编译器认不认

         4.首先需要满足有inline修饰或者是类中定义的函数,然后再由编译器决定的情况下内联函数会展开

内联函数的特点:

1.inline是一种以空间换时间的做法,省去调用函数,建立栈帧得额外开销,但是如果代码很长(一般是10行左右,具体取决于编译器),或者有递归函数,即使函数前面声明了inline,那么编译器也不会让该函数成为内联函数。

2.inline对于编译器而言只是一个建议,编译器会自动优化,如果定义的函数很长或者递归函数等等,编译优化时会忽略掉内联;而类的构造函数,析构函数和虚函数往往不是内联函数的最佳选择。

3.inline不可以声明和定义分离,.h文件中使用inline声明内联函数(内联展开是在编译时进行的,只有链接的时候源文件之间才有关系),.cpp文件中如果不使用inline定义函数,会报错链接错误。

内联函数与普通函数的区别:

1.内联函数在编译时展开,没有函数调用的开销,但可能会增加代码体积

2.普通函数在运行时进行调用,有一定的调用开销,但代码更紧凑

3.内联函数的定义通常放在头文件中,而普通函数定义放在源文件中,头文件只包含函数声明

定义:

在函数声明前加上"inline"关键字来定义内联函数

inline nint add(int a,int b)
{return a+b;
}

使用:使用时和普通函数一样调用即可

内联分为显式内联和隐式内联

显式内联:需要使用inline关键字,是在建议编译器将该函数作为内联函数处理。

// 显式内联函数定义
inline int add(int a, int b) {return a + b;
}
int main() {int result = add(3, 5);// 在这里,编译器可能会将add函数的代码直接插入到调用点return 0;
}

隐式内联:类内的成员函数的定义直接写在类的声明中时,不需要inline关键字,编译器会隐式地将其视为内联函数候选。

class Work {
public:// 隐式内联成员函数int multiply(int a, int b) {return a * b;}
};
int main() {Work w;int result = w.multiply(4, 6);// 这里编译器可能会将multiply函数的代码直接插入到调用点return 0;
}

内联函数的使用场景

1.当对程序执行性能有要求时,那么就适当使用内联函数

2.当想宏定义一个函数时,使用内联函数

3.写一些功能专一且性能关键的函数,这些函数的函数体不大,包含了很少的执行语句。通过inline声明,编译器不需要跳转到内存其他地址去执行函数调用,也不需要保留函数调用时的现场数据。

4.在类内部定义的函数会默认声明为inline函数,这有利于类实现细节的隐藏。(大部分是不推荐默认inline的)

不建议使用:

1.如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。

2.如果函数体内出现循环或者开关语句还有递归;那么执行函数体内代码的时间要比函数调用的开销大,还有可能造成栈空间枯竭。

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

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

相关文章

小林Coding—Java「二、Java基础篇」

󠀲󠀲二 Java基础面试篇 数据类型 引用类型 类:Class接口:Interface数组:Array枚举:Enum自动装箱:int -> Integer 自动拆箱:Integer -> int // 下面代码会先自动拆箱将sum转为…

GBDT 算法

GBDT 梯度决策提升树是将一些弱分类决策树的结果加在一起,每一棵决策树对前一颗觉得树残差进行优化,从而使得总体的损失值达到最小。 GBDT 公式 Fm-1: 上一棵树的结果 α \alpha α: 学习率 hm(x): 当前树,通过训练调整结果,降低…

java~Lambda表达式

目录 Lambda和匿名内部类 语法 函数式接口 无返回值(无参、有参) 有返回值(无参、有参) 语法精简 四个基本的函数式接口 方法引用 实例方法引用 静态方法引用 特殊方法引用 构造方法引用 数组引用 集合 List、Set …

PyQt5信号与槽二

窗口数据传递 在开发程序时,如果这个程序只有一个窗口,则应该关心这个窗口里面的各个控件之间是如何传递数据的;如果这个程序有多个窗口,那么还应该关心不同的窗口之间是如何传递数据的。对于多窗口的情况,一般有两种…

【java】多态

一、概念 多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作。 同一个事件发生在不同的对象上会产生不同的结果。 比如: public class Test {public static void main(String[] args) {Person xn…

使用Holoviews创建复杂的可视化布局

目录 一、Holoviews简介 二、安装Holoviews 三、Holoviews的基本概念 元素(Elements): 容器(Containers): 映射(Mappings): 四、基本用法 创建元素: …

Java2.1——异常

异常基本概念 一:程序出错 分类 : 编辑错误,逻辑错误,运行时错误 目的: 异常处理让程序出错了还运行,避免中止运行 二: 运行时错误 当出现编译时无法预料的问题,将运行错误报告…

2025年假期python,工作日python脚本求出 输出日期内容

# coding:utf-8 import datetime# 假设已知的节假日和调休安排 holidays [datetime.date(2025, 1, 1), # 元旦datetime.date(2025, 1, 28), # 春节datetime.date(2025, 1, 29), # 春节datetime.date(2025, 1, 30), # 春节datetime.date(2025, 1, 31), # 春节datetime.dat…

1TB! 台湾最新倾斜摄影3DTiles数据分享

之前的文章分享了546GB香港倾斜摄影3DTiles数据,主要是验证倾斜模型3DTiles转换工具的生产效率和数据显示效率,结果对比可以看出无论是数据生产速度以及成果数据显示效率上,都优于其他两种技术路线。最近使用倾斜模型3DTiles工具生产了台湾地…

ssm136公司项目管理系统设计与实现+jsp(论文+源码)_kaic

毕 业 设 计(论 文) 题目:公司项目管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本T公司项目管理系…

【Sql Server】sql server 2019设置远程访问,外网服务器需要设置好安全组入方向规则

大家好,我是全栈小5,欢迎来到《小5讲堂》。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言1、无法链接…

小车综合玩法--2.超声波避障

一、实验准备 通过超声波模块与小车结合,实现小车超声波避障。小车接线已安装,且安装正确 二、实验原理 通过超声波我们获取小车与障碍物的距离。当检测到小车与障碍物的距离小于我们的设置的距离时,小车左旋避开障碍物。 三、实验源码 #!…

「二」体验HarmonyOS端云一体化开发模板——创建端云一体化工程

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…

操作系统启动实验

简单的操作系统 汇编代码 ; hello-os ; TAB4ORG 0x7c00 ; 指明程序装载地址; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy codeJMP entryDB 0x90DB "HELLOIPL" ; 启动扇区名称(8字节)DW 512 ; 每个扇区(s…

助力模型训练,深度学习的经典数据集介绍

想要训练出效果好的模型,高质量的数据集必不可少。深度学习的经典数据集包括MNIST手写数字数据集、Fashion MNIST数据集、CIFAR-10和CIFAR-100数据集、ILSVRC竞赛的ImageNet数据集、用于检测和分割的PASCAL VOC和COCO数据集等,本文将对这些数据集进行介绍…

Spring基础——针对实习面试

目录 Spring基础什么是Spring框架?列举一些重要的Spring模块Spring Core 核心模块Spring AOP 模块Spring MVC 模块Spring Data 模块Spring Security 模块Spring Boot 模块 Spring,Spring MVC,Spring Boot之间什么关系(区别&#x…

PH热榜 | 2024-11-17

DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论、搜索等功能,欢迎大家体验。 在线预览 1. Octokit 标语:人人都能用的无代码游戏和AR滤镜制作工具 介绍:Octokit 是一款无需编程技能就能使用…

分享本周所学——三维重建算法3D Gaussian Splatting(3DGS)

大家好,欢迎来到《分享本周所学》第十二期。本人是一名人工智能初学者,刚刚读完大二。前几天自学了一下3D Gaussian Splatting(3DGS),觉得非常有意思。写这篇文章主要是因为网上大部分关于3DGS的文章都比较晦涩&#x…

Python-简单病毒程序合集(一)

前言:简单又有趣的Python恶搞代码,往往能给我们枯燥无味的生活带来一点乐趣,激发我们对编程的最原始的热爱。那么话不多说,我们直接开始今天的编程之路。 编程思路:本次我们将会用到os,paltform,threading,ctypes,sys,…

技术成长战略是什么?

文章目录 技术成长战略是什么?1. 前言2. 跟技术大牛学成长战略2.1 系统性能专家案例2.2 从开源到企业案例2.3 技术媒体大V案例2.4 案例小结 3. 学习金字塔和刻意训练4. 战略思维的诞生5. 建议 技术成长战略是什么? 1. 前言 在波波的微信技术交流群里头…