跟我学C++中级篇——内联补遗

一、内联引出的问题

在将一个内联变量定义到编译单元时,然后再按正常的方式使用时,编译会报一个错误“odr-used”。ODR,One Definition Rule,单一定义规则。在C/C++程序中,变量的定义只能有一处,至于ODR的规则如何定义,这个在C++的标准文档中说明的非常清楚。大家可以去查询,有时间再总结一下一起分析。
这个问题就回到了inline的问题相关,即inline(and odr-used)变量和函数,在每个编译单元是可以存在一个定义的。这也是为什么inline的变量可以在不同的编译单元使用的原因。

二、内联的优势

在前面分析的基础上,可以进一步提出,内联对编译是一种类似于提示的机制,告诉编译器,你可以看到更多的代码和更大的范围,至于能不能优化,就看编译器的能力了。
编译器在得到更多的信息后,可以有以下几个方面的优化:
1、IPO(Interprocedural Optimization)
过程优化,这个其实非常好理解,比如for循环内的变量,在低版本的编译器中可能是一个需要手动优化的目标,但在高版本编译器会自动根据情况优化到手动指定的效果。同样对于一些运算中间过程可以进行省略而直接使用结果(常量折叠)。这就需要编译器看到的代码要相对完全,包括本文提到的inline。

2、LTO(Link Time Optimization)
链接时优化,它其实是IPO的一部分。即在链接时对相关的代码进行优化。也就是说,编译器会根据不同的编译单元编译出不同的目标文件,这些目标文件就有可能进行链接时的优化。

可能有人因此会说,既然编译器如此高大威猛,为何还需要程序员小白们费心的搞这个inline?其实非常好理解,再威猛的战士也有疏漏的时候儿,不可能面面俱到,而开发者就是给编译器一个指标或者说建议,让其知晓,此处可能可以优化。另外一个就是解决文章一开头提到的ODR的问题。

三、说明

其实在前面就提到过对虚拟函数的内联优化支持,可以肯定的说,普遍意义上讲肯定是内联无法适配虚函数。但是在一些特殊的情况下,比如下面的代码:

class A{
public:virtual void Test(){...}
}
class B:public A
{
public:virtual void Test(){...}
}
inline void Get(A &a){a.Test();
}
int main(){
B b;
b.Test(b);
return 0;
}

其实这种就是典型的编译完全可以明白并确定inline函数中的a具体的对象,所以,就可以进行内联的优化处理,其它的情况也是类似。编译器对代码的优化随着技术的进步在不断的推进,比如现在的AI大模型的出现,以后会不会出现完全由编译器为主,而人为设置标记为辅的编程方式,也不好说。毕竟,AI自己编程都出现了,自已编程自己编译,自己测试并部署也不是不可能,这是不是《终结者》里的天网的雏形?

四、总结

许多的技术看起来很简单,用起来也没有什么可以体察到困难的地方。比如这个inline,反正写不写以后编译器还要看自己心情来处理。但其实真正的向内部观察其原理,会发现有很多技术点在等着你去融会贯通。可以把inline的函数和变量通过汇编去深入分析一下,再查看一下它的具体的实现和优化的过程,好多细节的明白,会是开发者提升自己能力的一个重要的契机!

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

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

相关文章

移除链表元素(C语言)———链表经典算法题

题目描述:203. 移除链表元素 - 力扣(LeetCode) 答案展示: 答1(遍历删除): /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNo…

第十七章 数据管理和组织变革管理练习

单选题 (每题1分,共10道题) 1、 [单选] 以下不属于科特确定了有效传播愿景关键要素是? A:保持简单 B:使用比喻、类比和例子 C:重复,重复,再重复 D:解释表面上的一致性 正确答案:D 你的答案:D 解析:详见书本P469 七大要素,D选项和第六要素 不一致和一致性 2、 …

c++多态机制

多态 在 C 中,多态(Polymorphism)是一种面向对象编程的重要概念,它允许不同类的对象对同一消息做出不同的响应。具体来说,多态性允许基类的指针或引用在运行时指向派生类的对象,并且根据对象的实际类型来调…

微信小程序支付全攻略:从零搭建到安全交易【微信支付】

微信小程序支付全攻略:从零搭建到安全交易 在移动互联网时代,微信小程序凭借其便捷性和高效性,成为了众多企业和开发者的心头好。其中,微信支付和小程序支付功能的集成,无疑是提升用户体验、增加商业转化的关键环节。…

1.5编程基础之循环控制 03:均值

描述 给出一组样本数据,计算其均值。 输入 输入有两行,第一行包含一个整数n(n小于100),代表样本容量;第二行包含n个绝对值不超过1000的浮点数,代表各个样本数据。 输出 输出一行&#xff0…

CentOS 安装 Portainer

Portainer Community Edition是一个针对容器化应用程序的轻量级服务交付平台,可用于管理 Docker、Swarm、Kubernetes 和 ACI 环境。它的设计理念是部署和使用都简单,该应用程序允许您通过“智能”GUI 和/或广泛的 API 管理所有编排器资源。 1、查询Porta…

第七届精武杯部分wp

第一部分:计算机和手机取证 1.请综合分析计算机和手机检材,计算机最近一次登录的账户名是 答案:admin 创建虚拟机时直接给出了用户名 2. 请综合分析计算机和手机检材,计算机最近一次插入的USB存储设备串号是 答案&#xff1a…

抖音快速涨粉秘籍解密!从巨量千川投流真实粉丝,快速增粉1000~10万!

随着抖音的风靡,对于众多用户来说,快速涨粉已经成为了追求的目标。在这篇文章中,我们将揭秘全网都在搜索的抖音快速涨1000粉的方法,帮助你打造一个高人气的抖音账号!从巨量千川投流到官方真实流量,再到真实…

外卖系统微信小程序支付

微信小程序支付时序图 其中第9.步骤就是微信小程序前端调用wx.requestPayment

QT7_视频知识点笔记_3_自定义控件,事件处理器⭐,定时器,QPainter,绘图设备,不规则窗口

第三天: 自定义控件,事件处理器⭐,定时器,QPainter,绘图设备,不规则窗口实现 1.自定义控件: 创建新的QT控件类,然后再需要使用的地方--》提升为 来使用如何使用基础控件的信号和槽函数&…

1.前端环境搭建

1.安装nodejs 因为我们开发Vue项目需要使用npm命令来创建和启动,安装node.js是为了获得这个命令,目前和使用node.js无关 下载地址:http://nodejs.cn/download/ 下载完之后安装,通过cmd查看是否安装成功 node --version2.创建项目…

FFmpeg提取视频参数,以及剪辑视频,拼接视频,合并视频,抽帧等

FFmpeg提取视频参数&#xff0c;以及剪辑视频&#xff0c;拼接视频&#xff0c;合并视频&#xff0c;抽帧等 视频封面图获取视频 视频封面图获取 #ifndef _BUFFER_CONTAINER_H_ #define _BUFFER_CONTAINER_H_ #include <Memory>template <typename T> class Buffer…

【力扣】1089.复写零

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不…

深度探索Edge浏览器

深度探索Edge浏览器 随着网络技术的不断发展和人们对浏览体验要求的提高&#xff0c;浏览器作为我们日常上网的重要工具&#xff0c;其性能、安全性和易用性都成为了用户关注的重点。近年来&#xff0c;微软推出的Edge浏览器凭借其卓越的性能和独特的功能&#xff0c;逐渐成为…

探讨 vs2019 c++ 里函数指针与函数类型在使用上的语法区别

&#xff08;1&#xff09;咱们可以用 decltype &#xff08;&#xff09; 来判断函数的类型。但以这个类型定义有用的可指向已存在函数的变量&#xff0c;却行不通。测试如下&#xff1a; 如果把上面的注释去掉会报错&#xff1a; 所以函数类型只有语法意义。但在使用上没有函…

【C语言】/*操作符(下)*/

目录 一、操作符的分类 二、二进制和进制转换 2.1 进制 2.2 进制之间的转换 三、原码、反码、补码 四、单目操作符 五、逗号表达式 六、下标引用操作符[] 七、函数调用操作符() 八、结构体成员访问操作符 8.1 直接访问操作符(.) 8.2 间接访问操作符(->) 九、操作符…

openGauss学习笔记-280 openGauss性能调优-实际调优案例09-修改启动参数解决TPCC大幅度波动

文章目录 openGauss学习笔记-280 openGauss性能调优-实际调优案例09-修改启动参数解决TPCC大幅度波动280.1 现象描述280.2 优化分析openGauss学习笔记-280 openGauss性能调优-实际调优案例09-修改启动参数解决TPCC大幅度波动 280.1 现象描述 openGauss数据库在4路鲲鹏服务器单…

修改el-checkbox样式

一定要在最外层&#xff1b; //未选中框/deep/ .el-checkbox__inner{border-color: #0862a3;}//选中框/deep/ .el-checkbox__input.is-checked .el-checkbox__inner{background-color: #0862a3;border-color: #0862a3;}//未选中框时右侧文字/deep/ .el-checkbox__label{}//选中…

git 推送github 选https遇到登录 openSSH问题

使用https需要使用github令牌token作为密码&#xff0c; 使用SSH不需要登录。 还有一个问题&#xff1a; 创建github仓库后没有quick setup页面解决办法 千万不要点击任何多的操作&#xff01;&#xff01;&#xff01;输入仓库名&#xff0c;直接create&#xff01;&#x…

return语句

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 return语句 一、return语句后面跟表达式二、return无返回三、return返回的值和函数返回类型不一致四、return语句执行后,后方仍然存在代码五、存在分支语句&#xff0c;需考虑…