【C/C++】inline关键词

C++ inline 关键字学习笔记

一、什么是 inline 函数?

inline(内联)是 C++ 中的一个关键字,表示“将函数的代码直接插入到调用点”,以减少函数调用开销,提升执行效率。

✅ 注意:inline 是一种“请求”,编译器不一定会采纳它。


二、为什么使用 inline

通常,函数调用会有如下流程:

  • 参数压栈
  • 跳转到函数地址
  • 执行函数体
  • 返回并恢复现场

这个过程有一定的性能开销。对于体积小、调用频繁的函数,可以使用 inline 来减少这些开销。


三、如何使用 inline

✅ 语法格式:

inline 返回类型 函数名(参数) {// 函数体
}

四、代码示例

🔹 示例一:普通函数

int add(int a, int b) {return a + b;
}int main() {int result = add(1, 2);  // 正常函数调用,有开销
}

🔹 示例二:inline 函数

inline int add(int a, int b) {return a + b;
}int main() {int result = add(1, 2);  // 编译器可能会将调用展开为 int result = 1 + 2;
}
  • 优势:省去了函数调用的跳转和返回,提升性能。
  • 缺点:如果函数体太大、频繁展开,会增加可执行文件体积(代码膨胀)。

五、适合使用 inline 的场景

适合用 inline 的情况不适合用 inline 的情况
函数体非常小函数体很大
调用频繁很少调用
希望去除调用开销对性能影响不大
函数定义通常写在头文件中函数定义隐藏在源文件中

六、常见应用

🔸 头文件中定义的函数默认建议加 inline

// math_utils.hpp
#pragma onceinline int square(int x) {return x * x;
}

如果你不加 inline,多处包含这个头文件时,会造成链接错误(重复定义)。


七、与宏的对比

#define ADD(a, b) ((a) + (b))     // 宏inline int add(int a, int b) {   // inline 函数return a + b;
}
  • 宏没有类型检查、可能有副作用
  • inline 函数安全、可调试、有作用域

结论:inline 更推荐使用!


八、总结

项目说明
作用减少函数调用开销,将函数体插入到调用点
使用场景函数体小、调用频繁、在头文件中定义
注意事项编译器不一定接受;不要滥用大型函数内联
替代宏inline 比宏更安全,推荐使用

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

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

相关文章

React useMemo函数

第一个参数是回调函数,返回计算的结果,第二个参数是依赖项,该函数只监听count1变量的变化 import { useReducer, useState } from react; import ./App.css;// 定义一个Reducer函数 根据不同的action进行不同的状态修改 function reducer(st…

对比测评:为什么AI编程工具需要 Rules 能力?

通义灵码 Project Rules 在开始体验通义灵码 Project Rules 之前,我们先来简单了解一下什么是通义灵码 Project Rules? 大家都知道,在使用 AI 代码助手的时候,有时候生成的代码不是自己想要的,或者说生成的代码采纳后…

Java学习手册:MyBatis 框架作用详解

一、MyBatis 简介 MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发。它通过将 Java 对象与数据库表之间的映射关系进行配置,使得开发者可以使用简单的 SQL 语句和 Java 代码来完成复杂的数据操作。MyBatis 支持自定义 SQL 语句,提供了灵…

list的设计

#pragma once #include<assert.h> #include<iostream> using namespace std; namespace aqc {template<class T>struct list_node{list_node* _next;list_node* _prev;T _data;list_node(const T& xT())//加const防止权限放大&#xff0c;用引用减少拷贝…

基于 PyQt 的YOLO目标检测可视化界面+ nuitka 打包

在人工智能和计算机视觉领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;是一种广泛使用的实时目标检测算法。为了直观地展示YOLO算法的检测效果&#xff0c;我们使用Pyqt框架进行检测结果的可视化&#xff0c;同时为了使其能够脱离Python环境&#xff0c;我们…

2.1 阅读错题---02-04年

引言 2002年-2004年英语阅读错题汇总与分析总结。 一、02年阅读 Text 1 题目&#xff1a;21题 题型&#xff1a;细节题 原因&#xff1a;单词认错了&#xff0c;原句中 in sympathy with 译为 与…一致 &#xff1b;题干中的 sympathy 译为 同情 题目&#xff1a;22题 题…

Axure疑难杂症:中继器制作下拉菜单(多级中继器高级交互)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 本文视频课程记录于上述地址第五章中继器专题第11节 课程主题:中继器制作下拉菜单 主要内容:创建条件选区、多级中继器…

即刻启程,踏上W55MH32高性能以太网单片机学习之路!

单芯片解决方案&#xff0c;开启全新体验——W55MH32 高性能以太网单片机 W55MH32是WIZnet重磅推出的高性能以太网单片机&#xff0c;它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身&#xff0c;具体来说&#xff0c;一颗W55MH32内置高性能Arm Cortex-M3核心…

C++负载均衡远程调用学习之上报功能与存储线程池

目录 1. Lars-reportV0.1 report模块介绍 2.Lars-reporterV0.1 reporter项目目录构建 3.Lars-ReporterV0.1 数据表和proto协议环境搭建 4.Lars-ReporterV0.1上报请求业务处理 5.Lars-ReporterV0.1上报请求模块的测试 6.Lars-ReporterV0.2开辟存储线程池-网络存储分离 1. L…

LabVIEW三轴电机控制

在工业自动化迅猛发展的当下&#xff0c;多轴伺服电机控制系统在制造业、3D 打印等众多领域的需求与日俱增。它不仅要实现高精度的单轴运动控制&#xff0c;还需保障多轴协同作业的精准度&#xff0c;对响应速度也有严格要求。LabVIEW 开发多轴伺服电机控制系统&#xff0c;有效…

驱动开发硬核特训 · Day 27(下篇):深入掌握 Common Clock Framework 架构与实战开发

节。 在本篇内容中&#xff0c;我们将围绕 Linux 内核中的时钟子系统核心架构 —— Common Clock Framework&#xff08;简称 CCF&#xff09;展开深入讲解&#xff0c;目标是帮助你全面理解其设计理念、主要数据结构、注册流程、驱动实现方式&#xff0c;以及如何基于 NXP i.M…

数据库基础:数据库类型与MySQL特点详解

一、数据库的主要类型 1. 关系型数据库(RDBMS) 特点:基于关系模型,数据以表格形式存储 代表产品:MySQL、Oracle、SQL Server、PostgreSQL 优势:ACID事务支持、强一致性、成熟的SQL标准 适用场景:需要复杂查询和事务支持的场景 2. 非关系型数据库(NoSQL) 文档型数据库:Mo…

49认知干货:产品的生命周期及类型汇总

49章:产品的生命周期与类型划分 宇宙是运动的而非静止的,任何事物亦是如此。只要是存在的事物,便必然存在周期性变化,就像四季更替中的冬日枯树、春日新芽、夏日繁茂与秋日凋零。 这也意味着:事物的发展,离不开周期的更迭与演化,死亡并非终点,而是一种新的循环转变。 …

【2025最新】为什么用ElasticSearch?和传统数据库MySQL与什么区别?

Elasticsearch 深度解析&#xff1a;从原理到实践 一、为什么选择 Elasticsearch&#xff1f; 数据模型 Elasticsearch 是基于文档的搜索引擎&#xff0c;它使用 JSON 文档来存储数据。在 Elasticsearch 中&#xff0c;相关的数据通常存储在同一个文档中&#xff0c;而不是分散…

Docker安装Gitblit(图文教程)

本章教程,使用Docker安装部署Gitblit。 一、Gitblit简介 Gitblit 是一个基于 Java 的 Git 仓库管理工具,主要用于在局域网或小型团队环境中搭建私有 Git 服务器。它提供了一个简单易用的 Web 界面,用于浏览代码、管理仓库和用户权限等。 二、拉取镜像 sudo docker pull git…

nDCG(归一化折损累计增益) 是衡量排序质量的指标,常用于搜索引擎或推荐系统

nDCG&#xff08;归一化折损累计增益&#xff09; 是衡量排序质量的指标&#xff0c;常用于搜索引擎或推荐系统。核心思想是&#xff1a;排名越靠前的高质量结果&#xff0c;对整体评分的贡献越大&#xff0c;但后续结果的贡献会逐渐“打折”。最终通过对比实际排序与理想排序的…

《从线性到二维:CSS Grid与Flex的布局范式革命与差异解析》

在前端开发的广袤宇宙中&#xff0c;CSS布局技术宛如闪耀的星辰&#xff0c;不断革新与演进&#xff0c;为构建绚丽多彩的网页世界提供了坚实的支撑。其中&#xff0c;CSS Grid布局与Flex布局作为两颗璀璨的明星&#xff0c;以其独特的魅力和强大的功能&#xff0c;深受开发者们…

2025年01月03日美蜥(杭州普瑞兼职)一面

目录 vue2 vue3 的区别react 性能优化react 组件传值v-for 和 v-if 的优先级react 中多个接口请求的数据&#xff0c;需要渲染到一个列表上怎么处理百万条数据怎么渲染vue2、vue3 的响应式原理微前端了解吗git 版本控制git mearge 和 git rebase 的区别垂直水平居中react 中实…

【聚类分析】基于copula的风光联合场景生成与缩减

目录 1 主要内容 风光出力场景生成方法 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序方法复现《融合风光出力场景生成的多能互补微网系统优化配置》风光出力场景生成部分&#xff0c;目前大多数研究的是不计风光出力之间的相关性影响&#xff0c;但是地理位置相近…

LeetCode 1128 等价多米诺骨牌对的数量 题解

今天的每日一题&#xff0c;我的思路还是硬做&#xff0c;不如评论区通过状压写的简单&#xff0c;但是答题思路加算法实现是没有问题的&#xff0c;且时间复杂度也是可以通过的&#xff0c;毕竟全是o(n) 那么我就来说一下我的思路&#xff0c;根据dominoes[i] [a, b] 与 domi…