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

C++ inline 关键字有什么做用?

C/C++ 之中 inline 是一个很有意思的关键字,奇奇怪怪的用法见过不少,今天抽点时间出来聊聊这个东西。

inline 可以用在那些方面?修饰 inline 内链关键字到底有什么作用?

OK:started

1、inline 可以用在类成员函数的声明上面,如下所示:

class Foo final {
public:inline Foo() noexcept {printf("%s\n", ".ctor");}inline void Say() {printf("%s\n", "hello world!");}
};

上述代码没有必要在函数上显示声明,inline 内链,因为如上述代码,均会被隐式声明为 inline 函数。

无论:上述类实现,写在头文件(.h)或者是源文件(.cpp)之中。

所以:若成员函数实现在类中,不需要显示声明 inline 堆代码字节数。

2、inline 可以用在类成员函数的实现,如下所示:

#include <stdio.h>class Foo final {
public:Foo();void Say();
};inline Foo::Foo() {printf("%s\n", ".ctor");
}inline void Foo::Say() {printf("%s\n", "hello world!");
}

上述代码可以写在头文件之中,也可以写在源文件之中,但如果取消了 inline,那么写在头文件之中被多个源文件 include 那么就会导致符号重定义冲突,单个源文件引入却不会。

3、inline 可以在全局函数上面修饰,如下所示:

inline int Add(int x, int y) {return x + y;
}

上述代码可以写在头文件之中,也可以写在源文件之中,但如果取消了 inline,那么写在头文件之中被多个源文件 include 那么就会导致符号重定义冲突,单个源文件引入却不会。

inline 关键字的作用有几个方面:

1、头文件之中定义函数实现

2、建议编译器通过内嵌的方式优化代码执行能效

3、inline 函数,由调用的函数(递归链)的源文件来实现

     所以:inline 函数可以访问未被它引入的类型或函数,这取决于编译器。

inline 关键字声明并不意味着,编译器会把声明 inline 的函数内嵌到调用该函数的程序之中,这取决于函数的复杂度。

不会被优化,但被声明为 inline 的函数:

1、函数指针或函数引用

2、复杂的 inline 函数体

3、虚函数

4、递归函数

那些函数被声明为 inline 通常会被编译器优化呢?

即单个函数体内,具备少量的 for 循环,逻辑结构简单,嵌套层数少,并且函数体代码行数不多,几行以内的最佳。

例如:

一个简单的加法、乘法、除法函数。

即:

不满足下面这个条件:

inline 函数实现非常复杂,包含大量的代码逻辑、循环或递归等,编译器可能认为将其内联展开会导致代码膨胀,影响可执行文件的大小和性能。

但需要注意一点,inline 是否生效取决于编译器的代码优化级别、跟编译器对于 inline 函数展开的文件大小、及性能的评估。

一个形象的例子:

#include <stdio.h>class Foo final {
public:Foo();void Say();
};inline Foo::Foo() {printf("%s\n", ".ctor");
}inline void Foo::Say() {printf("%s\n", "hello world!");
}int main() {Foo foo;foo.Say(); return 0;
}

在未打开优化的情况下:

内链函数不会被编译器优化

.LC0:.string ".ctor"
Foo::Foo() [base object constructor]:push    rbpmov     rbp, rspsub     rsp, 16mov     QWORD PTR [rbp-8], rdimov     edi, OFFSET FLAT:.LC0call    putsnopleaveret
.LC1:.string "hello world!"
Foo::Say():push    rbpmov     rbp, rspsub     rsp, 16mov     QWORD PTR [rbp-8], rdimov     edi, OFFSET FLAT:.LC1call    putsnopleaveret
main:push    rbpmov     rbp, rspsub     rsp, 16lea     rax, [rbp-1]mov     rdi, raxcall    Foo::Foo() [complete object constructor]lea     rax, [rbp-1]mov     rdi, raxcall    Foo::Say()mov     eax, 0leaveret

在打开优化的情况下:

内链函数被优化掉到调用方函数之中了

main:                                   # @mainpush    raxmov     edi, offset .L.str.1call    putsmov     edi, offset .L.str.2call    putsxor     eax, eaxpop     rcxret
.L.str.1:.asciz  ".ctor".L.str.2:.asciz  "hello world!"

相关文章:

C++ inline 关键字有什么做用?

C/C 之中 inline 是一个很有意思的关键字&#xff0c;奇奇怪怪的用法见过不少&#xff0c;今天抽点时间出来聊聊这个东西。 inline 可以用在那些方面&#xff1f;修饰 inline 内链关键字到底有什么作用&#xff1f; OK&#xff1a;started 1、inline 可以用在类成员函数的声明…...

eNSP学习——理解ARP及Proxy ARP

目录 名词解释 实验内容 实验目的 实验步骤 实验拓扑 配置过程 基础配置 配置静态ARP 名词解释 ARP (Address Resolution Protocol)是用来将IP地址解析为MAC地址的协议。ARP表项可以分为动态和静态两种类型。   动态ARP是利用ARP广播报文&#xff0c;动态执行并自动进…...

Unity中UGUI在Mask剪裁粒子特效的实现

在Unity使用Mask是剪裁不了粒子特效的&#xff0c;之前有想过RenderTexture来实现&#xff0c;不过使用RenderTexture不适合用于很多个特效&#xff0c;因为RenderTexture依赖Camera的照射&#xff0c;如果在背包中每种道具都有不同的特效&#xff0c;那使用RenderTexture则需要…...

精通 VS 调试技巧,学习与工作效率翻倍!

​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ ​ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; ​ 所属专栏&#xff1a;C语言学习 ​ 贝蒂的主页&#xff1a;Betty‘s blog 1. 什么是调试 当我们写代码时候常常会遇见输出结果不符合我们预…...

yarn 安装包时报“certificate has expired”

在通过yarn包管理器安装 yarn install 时候 报错&#xff1a; info No lockfile found. [1/4] Resolving packages... error Error: certificate has expired at TLSSocket.onConnectSecure (node:_tls_wrap:1539:34) at TLSSocket.emit (node:events:513:28) at…...

Qt5项目拆解第一集解决:中文乱码| 全局字体|注册表|QSS/CSS

# 一、乱码解决代码片段 QTextCodec是Qt中用于处理文本编码和字符集转换的类。它提供了一系列静态函数来实现不同编码的文本转换,包括编码转换、字符集检测和转换、以及数据流中的文本编码处理。QTextCodec类使得Qt可以在不同的编码和字符集之间进行无缝转换,从而方便地处理…...

消息队列RabbitMQ.01.安装部署与基本使用

目录 RabbitMQ的作用 Message queue 释义 问题思考 存在的问题 优化方案 案例分析 带来的好处 消息队列特点 Email邮件案例分析 Docker安装部署RabbitMQ 1.下拉镜像 2.运行RabbitMQ 3.打开防火墙端口号并重新运行防火墙 4.容器启动后,可以通过 docker logs 容器 查…...

1.24号c++

C绪论 c是c语言的扩充&#xff0c;C包含了C的所有属性&#xff0c;换一句话说&#xff0c;C语言在C中都合法。 C语言编程思想&#xff1a;面向过程 c编程思想&#xff1a;面向对象 可以说在C中一切皆对象。 c的三大属性&#xff1a;封装&#xff0c;继承&#xff0c;多态。…...

【GitHub项目推荐--12 年历史的 PDF 工具开源了】【转载】

最近在整理 PDF 的时候&#xff0c;有一些需求普通的 PDF 编辑器没办法满足&#xff0c;比如 PDF 批量合并、编辑等。 于是&#xff0c;我就去 GitHub 上看一看有没有现成的轮子&#xff0c;发现了这个 PDF 神器「PDF 补丁丁」&#xff0c;让人惊讶的是这个 PDF 神器有 12 年的…...

React16源码: React中的PortalComponent创建, 调和, 更新的源码实现

PortalComponent 1 &#xff09;概述 React Portal之所以叫Portal&#xff0c;因为做的就是和“传送门”一样的事情render到一个组件里面去&#xff0c;实际改变的是网页上另一处的DOM结构主要关注 portal的创建, 调和, 更新过程 2 &#xff09;源码 定位到 packages/react-…...

Hive-SQL语法大全

Hive SQL 语法大全 基于语法描述说明 CREATE DATABASE [IF NOT EXISTS] db_name [LOCATION] path; SELECT expr, ... FROM tbl ORDER BY col_name [ASC | DESC] (A | B | C)如上语法&#xff0c;在语法描述中出现&#xff1a; []&#xff0c;表示可选&#xff0c;如上[LOCATI…...

编译原理2.3习题 语法制导分析[C++]

图源&#xff1a;文心一言 编译原理习题整理~&#x1f95d;&#x1f95d; 作为初学者的我&#xff0c;这些习题主要用于自我巩固。由于是自学&#xff0c;答案难免有误&#xff0c;非常欢迎各位小伙伴指正与讨论&#xff01;&#x1f44f;&#x1f4a1; 第1版&#xff1a;自…...

JUC-CAS

1. CAS概述 CAS(Compare ans swap/set) 比较并交换&#xff0c;实现并发的一种底层技术。它将预期的值和内存中的值比较&#xff0c;如果相同&#xff0c;就更新内存中的值。如果不匹配&#xff0c;一直重试&#xff08;自旋&#xff09;。Java.util.concurrent.atomic包下的原…...

Effective C++——关于重载赋值运算

令operator返回一个*this的引用 在重载,,*等运算符时&#xff0c;令其返回一个指向this的引用。 class MyClass {int* val; public:MyClass(int i) : val(new int(i)){}MyClass():val(new int(0)){}void print() {cout << *val << endl;}MyClass& operator(co…...

vscode debug

需要对GitHub上的工程debug。 所以花时间看了下,参考了bili视频和chatgpt的解答。 chatgpt给的步骤 要在 VS Code 中调试 C++ 项目,可以按照以下步骤进行设置和操作: 确保已安装 C++ 扩展:在 VS Code 中选择 “Extensions”(或使用快捷键 Ctrl+Shift+X),搜索并安装官…...

数据库选型其实技术维度不太重要

看到这个标题可能觉得我在乱说&#xff0c;数据库选型要从多个角度和维度看来&#xff0c;还有各种POC。很多供应商朋友告诉我POC是一个漫长的过程&#xff0c;非常痛苦&#xff0c;要解决各种技术问题。怎么能说和技术无关呢&#xff1f; 因为从我的经历和周围听说的经验来说…...

【C++】入门(二)

前言&#xff1a; c基础语法&#xff08;下&#xff09; 文章目录 五、引用5.1 引用概念5.2 引用使用规则5.3 常引用5.4 引用的使用场景5.5 引用和指针的区别 六、内联函数6.1 概念6.2 内联函数的特性 七、auto关键字&#xff08;C11&#xff09;7.1 概念7.2 使用规则7.3 用于f…...

Nginx 代理服务路径带/和不带/的问题

nginx初始配置如下 server {listen 6087;location / {#网站主页路径。此路径仅供参考&#xff0c;具体请您按照实际目录操作。#例如&#xff0c;您的网站运行目录在/etc/www下&#xff0c;则填写/etc/www。#允许跨域请求的域&#xff0c;* 代表所有add_header Access-Control-…...

C# CefSharp 输入内容,点击按钮,并且滑动。

前言 帮别人敲了个Demo,抱试一试心态&#xff0c;居然成功了&#xff0c;可以用。给小伙伴们看看效果。 遇到问题 1&#xff0c;input输入value失败&#xff0c;里面要套了个事件&#xff0c;再变换输入value。后来用浏览器开发工具&#xff0c;研究js代码&#xff0c;太难了&a…...

历经15年,比特币以强势姿态进军华尔街!270亿美元投资狂潮引发市场震荡!

本月&#xff0c;比特币庆祝了它的15岁生日&#xff0c;并以强势的姿态进军华尔街。最近美国交易所开始交易的比特币交易所交易基金&#xff08;ETF&#xff09;&#xff0c;已经获得了投资者的广泛接受。这一进展标志着比特币作为一种年轻资产迈向成熟的重要里程碑。 根据Glas…...

Qwen3-8B快速体验报告:部署简单,中文理解能力确实强

Qwen3-8B快速体验报告&#xff1a;部署简单&#xff0c;中文理解能力确实强 1. 开箱即用的AI体验 最近在测试各种开源大模型时&#xff0c;我发现了Qwen3-8B这个宝藏模型。作为Qwen系列的最新成员&#xff0c;这个80亿参数的模型在中文理解和推理能力上表现突出&#xff0c;最…...

万象视界灵坛惊艳案例:浅蓝格点背景中生成的‘同步率’进度条动态响应过程

万象视界灵坛惊艳案例&#xff1a;浅蓝格点背景中生成的"同步率"进度条动态响应过程 1. 效果展示概述 在视觉识别领域&#xff0c;传统界面往往显得单调乏味。万象视界灵坛通过创新的像素风格设计&#xff0c;将复杂的语义对齐过程转化为一场视觉盛宴。本次展示的核…...

LANDrop局域网文件传输:3分钟快速上手跨平台文件共享神器

LANDrop局域网文件传输&#xff1a;3分钟快速上手跨平台文件共享神器 【免费下载链接】LANDrop Drop any files to any devices on your LAN. 项目地址: https://gitcode.com/gh_mirrors/la/LANDrop 还在为不同设备间传输文件而烦恼吗&#xff1f;&#x1f914; LANDrop…...

实战指南:在CentOS 8上部署与配置BIND DNS权威服务器

1. 为什么要在CentOS 8上搭建DNS服务器&#xff1f; 想象一下这样的场景&#xff1a;公司内部有几十台服务器&#xff0c;每次新同事入职都要发一份IP地址对照表&#xff1b;开发团队每次联调测试都要反复确认服务地址&#xff1b;运维人员排查问题时要在记事本里翻找各种192.1…...

Iggy架构深度解析:从零构建的高性能消息流系统

Iggy架构深度解析&#xff1a;从零构建的高性能消息流系统 【免费下载链接】iggy Iggy is the persistent message streaming platform written in Rust, supporting QUIC, TCP and HTTP transport protocols, capable of processing millions of messages per second. 项目地…...

基于滑模变结构观测器的永磁同步电机失磁故障容错补偿控制

基于失磁故障容错补偿的永磁同步电机控制【提供参考资料】 一、算法简介 基于滑模变结构观测器&#xff0c;将状态电流观测值作为反馈量&#xff0c;利用滑模变结构等值控制原理&#xff0c;建立实时估计永磁磁链算式&#xff0c;从而进行补偿。 避免因失磁导致的转速下降&…...

乙巳马年春联生成终端参数详解:长文本生成稳定性保障机制

乙巳马年春联生成终端参数详解&#xff1a;长文本生成稳定性保障机制 1. 引言&#xff1a;当传统春联遇见现代AI 每到新年&#xff0c;家家户户贴春联是传承千年的习俗。一副好春联&#xff0c;不仅要对仗工整、平仄协调&#xff0c;更要蕴含美好的寓意。但创作一副原创的、有…...

CA6140车床拨叉831003加工工艺及铣左端面夹具设计【说明书+CAD图纸+SW三维】

CA6140车床拨叉831003作为机床传动系统中的关键零件&#xff0c;其加工质量直接影响设备运行的稳定性。该零件的加工工艺需兼顾尺寸精度与表面粗糙度要求&#xff0c;重点在于左端面的铣削加工。传统工艺方案多采用通用夹具定位&#xff0c;存在装夹效率低、重复定位精度差等问…...

给客户发固件,别再傻傻传源码了!手把手教你用ESP32 Download Tool烧录PlatformIO生成的bin文件

专业级ESP32固件交付方案&#xff1a;从PlatformIO编译到客户安全烧录全流程 当我们需要将开发完成的ESP32固件交付给客户时&#xff0c;直接发送源代码往往不是最佳选择。这不仅涉及知识产权保护问题&#xff0c;还可能因为客户缺乏开发环境而导致沟通成本激增。本文将详细介绍…...

保姆级教程:在Ubuntu 16.04虚拟机上,一步步编译SSD202开发板的完整镜像(含kernel 4.9.84和buildroot 2020.05)

SSD202开发板镜像编译实战&#xff1a;从虚拟机配置到完整系统构建 1. 环境准备与工具链配置 在Ubuntu 16.04虚拟机上搭建嵌入式开发环境&#xff0c;首先要解决的是64位系统对32位工具链的兼容性问题。许多开发者在这一步就会遇到第一个"坑"——缺少必要的32位库文件…...