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!"

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

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

相关文章

Redisson 分布式锁解决主从一致性问题的原理

目录 一、主从不一致产生原因 二、Redisson 解决主从一致性的原理 一、主从不一致产生原因 1. Redis 主从集群&#xff1a;主从读写分离&#xff0c;主节点将数据同步给从节点 主节点&#xff1a;增删改从节点&#xff1a;读 2. 主从同步存在延迟&#xff0c;若主节点宕机…

前端开发提高效率的两大工具

一、浏览器中的开发者工具 怎么启动开发者工具&#xff1f; 在浏览器中按下F12或者鼠标右键点击检查 怎么利用&#xff08;常用的几点&#xff09;&#xff1f; 1、元素 点击标红的图标可以用于在页面选择元素&#xff0c;同时右侧会找到元素在前端代码中的位置 点击下方红…

(delphi11最新学习资料) Object Pascal 学习笔记---第3章第3节(Case语句)

Object Pascal 学习笔记&#xff0c;Delphi 11 编程语言的完整介绍 作者: Marco Cantu 笔记&#xff1a;豆豆爸 3.3 Case 语句 ​ 如果您的 if 语句变得非常复杂&#xff0c;并且它们基于对序数值的测试&#xff0c;您可以考虑将它们替换为 case 语句。case 语句包括一个用于…

Hudi学习笔记(一)

大数据发展背景 Hudi用于管理分布式文件系统上大型分析数据集存储&#xff0c;支持Spark和Flink整合。它能够是DFS数据集在分钟级时延内支持变更&#xff0c;也支持下游系统对这个数据集的增量处理。 学习目标 什么是数据湖为什么使用数据湖Hudi基本功能如何编译Hudi源码Hud…

MySQL(七)MySQL和Oracle、PostgreSQL的区别

文章目录 一、MySQL和Oracle1.1 基本差别1.2 使用区别 二、MySQL和PostgreSQL2.1 基本差别2.2 使用差别 本系列文章&#xff1a; MySQL&#xff08;一&#xff09;SQL语法、数据类型、常用函数、事务 MySQL&#xff08;二&#xff09;MySQL SQL练习题 MySQL&#xff08;三&…

vue 解决:Module not found: Error: Can‘t resolve ‘vue-router‘ 的问题

1、问题描述&#xff1a; 其一、报错为&#xff1a; Module not found: Error: Cant resolve vue-router 中文为&#xff1a; 找不到模块&#xff1a;错误&#xff1a;无法解析“vue-router” 其二、问题描述为&#xff1a; 根据报错的中文信息可知&#xff1a;应该是无法…

【linux】远程桌面连接到Debian

远程桌面连接到Debian系统&#xff0c;可以使用以下几种工具&#xff1a; 1. VNC (Virtual Network Computing) VNC&#xff08;Virtual Network Computing&#xff09;是一种流行的远程桌面解决方案&#xff0c;它使用RFB&#xff08;Remote Framebuffer Protocol&#xff0…

spring中循环依赖问题、Servlet 的过滤器与 Spring 拦截器区别

spring中的循环依赖问题 当A类中关联B&#xff0c;B类中关联A class A {B b; } class B {A a; } 正常java代码中new A时&#xff0c;b为null&#xff1b;new B时&#xff0c;a为null&#xff1b; 但是在spring中&#xff0c;由于对象是由spring容器管理的&#xff0c;当创建…

【开源】基于JAVA语言的新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

美易官方:波音供应大户Spirit AeroSystems股价上涨,错误安装爆裂飞机舱门事件引发关注

波音供应大户Spirit AeroSystems&#xff08;SPR&#xff09;的股价在美股盘前上涨了5%。据西雅图时报报道&#xff0c;波音公司的机械师错误地将爆裂的飞机舱门安装到其他飞机上&#xff0c;这可能意味着波音公司将承担飞机舱门爆裂事故的主要责任。 这一消息引发了市场对波音…

简单对象池ObjectPool

注释 在项目上经常会遇到生成很多同样的物体&#xff0c;往往会对性能造成很大的影响&#xff0c;所以可以采用以下的对象池系统来进行简单的操作 对象池系统 这个模块的主代码&#xff0c;主要用于生成对象&#xff0c;销毁对象 public class ObjectPool : Singleton<Ob…

35、WEB攻防——通用漏洞XSS跨站反射存储DOM盲打劫持

文章目录 XSS产生于前端的漏洞&#xff0c;常产生于&#xff1a; XSS分类&#xff1a; 反射型&#xff08;非持久型&#xff09; 存储型&#xff08;持久型&#xff09;&#xff0c;攻击代码被写入数据库中。常见于&#xff1a;写日志、留言、评论的地方 DOM型 DOM型XSS与…

Kubernetes-Taint (污点)和 Toleration(容忍)

目录 一、Taint&#xff08;污点&#xff09; 1.污点的组成 2.污点的设置、查看和去除 3.污点实验&#xff1a; 二、Toleration&#xff08;容忍&#xff09; 1.容忍设置的方案 2.容忍实验&#xff1a; Taint 和 toleration 相互配合&#xff0c;可以用来避免 pod 被分配…

Windows AD 组策略 通过脚本修改管理员密码:以安全方式

因为本文主要讲的是通过脚本如何以安全方式设置密码&#xff0c;所以关于组策略如何设置请参考这里&#xff1a; WinServer 2019 AD 组策略 启用本地管理员账号&#xff0c;重置密码_ad域命令启用administrator账户-CSDN博客 我们首先要讲一下&#xff0c;以一般方法创建的脚…

2017年认证杯SPSSPRO杯数学建模C题(第二阶段)移动端考研产品的春天真的到来了吗全过程文档及程序

2017年认证杯SPSSPRO杯数学建模 C题 移动端考研产品的春天真的到来了吗 原题再现&#xff1a; 2017 年的全国硕士研究生招生考试共有 201 万人报名参加&#xff0c;比去年增加了 24 万名考生&#xff0c;增加 13.56%。看起来新一轮的考研热潮即将到来&#xff0c;而考研教学和…

【技能---构建github中SSH密钥的流程】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言SSH基于账号口令的安全验证通过SSH连接到服务器打开终端&#xff08;命令行界面&#xff09;使用 SSH 命令连接&#xff1a; 在 Ubuntu 中生成 SSH 密钥并将其添…

用可视化案例讲Rust编程4. 用泛型和特性实现自适配shapefile的读取

本节已经涉及Rust学习曲线上的一个大坑&#xff1a;泛型和特性了&#xff0c;属于语言的深水区&#xff0c;如果初学者&#xff0c;建议看一眼知道有这个功能即可。 如果我们立足于功能实现&#xff0c;那么做到像上一节那样就可以了&#xff0c;从原理上来说&#xff0c;每个…

LeetCode刷题笔记之二叉树(一)

一、二叉树的基础知识 常见的二叉树类型&#xff1a; 满二叉树&#xff08;Full Binary Tree&#xff09;&#xff1a; 只有度为0和度为2的结点&#xff0c;且度为0的结点位于最后一层。完全二叉树&#xff08;Complete Binary Tree&#xff09;&#xff1a; 倒数第二层是满二…

unity36——原神等手游常用的物理bone(弹簧)裙摆,与Cloth(布料)裙摆插件 Magica Cloth 使用教程(一)

目前我们手游开发&#xff0c;经常会遇到头发&#xff0c;双马尾&#xff0c;长裙&#xff0c;飘带等。以前我们都是在三维软件中制作骨骼后&#xff0c;自己手动K针。这样做有一些弊端&#xff0c;时间长&#xff0c;并且K帧的飘带效果没法随着游戏中角色的移动&#xff0c;旋…

【学网攻】 第(8)节 -- 端口安全

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan【学网攻】 第(5)节 -- Cisco VTP的使用​​​​​​【学网攻】 第(6)节 -- 三层交换机实现VLAN间路由【学网攻…