[翻译] Effective C++, 3rd Edition, Item 30: 了解 inlining(内联化)的来龙去脉(上)

解决开着代理情况下pip或魔搭下载失败 最近由于经常配环境导致,老是要来回切clash关掉代理,非常的不方便如下面的,魔搭模型下载失败如下面的,pip换源后下载失败。 阅读详情

Item 30: 了解 inlining(内联化)的来龙去脉

作者:Scott Meyers

译者:fatalerror99 (iTePub's Nirvana)

发布:http://blog.youkuaiyun.com/fatalerror99/

inline functions ——多么棒的主意啊!它们看起来像 functions,它们产生的效果也像 functions,它们在各方面都比 macros(宏)好得太多太多(参见 Item 2),而你却可以在调用它们时不招致函数调用的成本。你还有什么更多的要求呢?

实际上你得到的可能比你想到的更多,因为避免函数调用的成本只是故事的一部分。编译器的优化一般说来是为了一段连续的没有函数调用的代码设计的,所以当你 inline 一个函数的时候,你就使得编译器对函数体实行上下文相关的专有优化成为可能。大多数编译器都不会对 "outlined" 函数调用实行这样的优化。

然而,在编程中,就像在生活中,没有免费午餐,而 inline functions 也不例外。一个 inline function 背后的思想是用函数的代码本体代替每一处对这个函数的调用,而且不必取得统计学博士学位就可以看出这样很可能会增加你的目标代码的大小。在有限内存的机器上,过分热衷于 inlining(内联化)会使得程序对于可用空间来说过于庞大。即使使用了虚拟内存,inline 引起的代码膨胀也会导致额外的分页调度,减少指令缓存命中率,以及随之而来的性能损失。

在另一方面,如果一个 inline function 本体很短,为函数本体生成的代码可能比为一个函数调用生成的代码还要小。如果是这种情况,inlining(内联化)这个函数可以实际上导致更小的目标代码和更高的指令缓存命中率!

记住,inline 是向编译器发出的一个请求,而不是一个命令。这个请求能够以隐式的或显式的方式提出。隐式的方法就是在一个 class definition(类定义)的内部定义一个函数:

class Person {
public:
  ...
  int age() const { return theAge; }    // an implicit inline request: age is
  ...                                   // defined in a class definition

private:
  int theAge;
};

这样的函数通常是 member functions(成员函数),但是 Item 46 阐释了 friend functions(友元函数)也能被定义在 classes 的内部,如果是这样,它们也被隐式地声明为 inline。

声明一个 inline function 的显式方法是在它的声明之前加上 inline 关键字。例如,以下就是标准 max template(来自 <algorithm>)的通常的实现:

template<typename T>                               // an explicit inline
inline const T& std::max(const T& a, const T& b)   // request: std::max is
{ return a < b ? b : a; }                          // preceded by "inline"

max 是一个 template 的事实引出一个观察结论:inline functions 和 templates 一般都是定义在头文件中的。这就使得一些程序员得出结论断定 function templates(函数模板)必须是 inline 的。这个结论是无效的而且有潜在的危害,所以它值得我们考察一下。

inline functions 一般必须在头文件内,因为大多数构建环境在编译期间进行 inlining(内联化)。为了用被调用函数的函数本体替换一个函数调用,编译器必须知道函数看起来像什么。(有一些构建环境可以在连接期间 inline,还有少数几个——比如,基于 .NET Common Language Infrastructure (CLI) 的托管环境——居然能在运行时 inline。然而,这些环境都是例外,并非规定。inlining(内联化)在大多数 C++ 程序中是一个 compile-time activity(编译期行为)。)

templates 一般在头文件内,因为编译器需要知道一个 template 看起来像什么以便需要时对它进行实例化。(同样,也不是全部如此。一些构建环境可以在连接期间进行 template instantiation(模板实例化)。然而,compile-time instantiation(编译期实例化)更为普遍。)

template instantiation(模板实例化)与 inlining(内联化)无关。如果你写了一个 template,而且你认为所有从这个 template 实例化出来的函数都应该被内联,那么就声明这个模板为 inline,这就是上面的 std::max 的实现所做的事情。但是如果你为没有理由被内联的函数写一个 template,就要避免声明这个 template 为 inline(无论显式的还是隐式的)。inlining(内联化)是有成本的,而且你不希望在毫无预见的情况下遭遇它们。我们已经说到 inlining(内联化)是如何引起代码膨胀的(这对于 template 作者来说是极为重要的一个考虑事项——参见 Item 44),但是,还有其它的成本,过一会儿我们再讨论。

在做这件事之前,我们先来完成对这个结论的考察:inline 是一个编译器可能忽略的请求。大多数编译器拒绝它们认为太复杂的 inline functions(例如,那些包含循环或者递归的),而且,除了最琐碎的以外的全部的对 virtual functions(虚拟函数)的调用都抗拒被 inlining(内联化)。不应该对这后一个结论感到惊讶。virtual 意味着“等待,直到运行时再断定哪一个函数被调用”,而 inline 意味着“执行之前,用被调用的函数取代调用的位置”。如果编译器不知道哪一个函数将被调用,你很难责备它们拒绝内联这个函数本体。

所有这些加在一起,就会得出:一个特定的 inline function 是否能真的被内联,取决于你正在使用的构建环境——主要是编译器。幸运的是,大多数编译器都有一个诊断层次,在它们不能 inline 一个你提出请求的函数时,会导致一个警告(参见 Item 53)。

(本篇未完,点击此处,接下篇)

【中项】案例分析 | 答题技巧 | 备考  对偏差原因的分析和对项目未来趋势的理解。如果偏差是由一次性事件或特殊原因引起的,那么这种偏差是非典型的,意味着未来的绩效将回归到预期的绩效水平。例如,如果项目初期的CPI小于1,原因是意外的自然灾害导致成本增加,那么这种偏差被认为是非典型的,因为它不太可能在未来重复发生。例如,如果项目初期的CPI小于1,且原因是低效的团队协作,那么这种偏差被认为是典型的,因为它可能在整个项目生命周期中持续存在。在实际应用中,项目经理通常会结合CPI、SPI和偏差趋势图等工具,综合分析偏差的性质,以制定合理的项目控制策略。 阅读详情

相关推荐

医疗领域BGE-M3模型微调全流程:从数据准备到效果评估

本文详细介绍了医疗领域BGE-M3模型的微调全流程,从数据准备到效果评估。通过医疗数据微调,BGE-M3模型在临床问答、病历检索等场景中表现显著提升,能够准确理解医学术语之间的细微差别。文章还提供了实战练习代码和效果评估指标,帮助开发者快速掌握医疗文本嵌入模型的应用技巧。

weixin_29098367的博客 282

[翻译] Effective C++, 3rd Edition, Item 27: 最少化 casting(强制转型)(下)

(点击此处,接上篇)在深入探究 dynamic_cast 的设计意图之前,值得留意的是多数 dynamic_cast 的实现都相当慢。例如,至少有一种通用的实现部分地基于对 class names(类名)进行 string comparisons(字符串比较)。如果你在位于一个 single-inheritance hierarchy(单继承体系)四层深处的一个 object 上执行 dyna

艺术编程 2677

[Ethernet in CANoe]2--如何在CANoe中去仿真CP版本的SOME/IP通信

上篇文章()介绍了SOME/IP的两种类型的数据格式,根据作者目前的项目经验,目前在CANoe V18之前的版本,CP版本的arxml是最方便实现SOME/IP以太网仿真的。作者目前只有CANoe V17的license,所以本片文章是在CANoe 17上基于CP版本的arxml去做仿真模拟。

汽车ECU自动化测试 1765

[翻译] Effective C++, 3rd Edition, Item 31: 最小化文件之间的 compilation dependencies(编译依赖)(上)

Item 31: 最小化文件之间的 compilation dependencies(编译依赖)作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/你进入到你的 C++ 程序中,并对一个 class 的 implementation(实现)进行了细微的改变。提醒你

艺术编程 4619

(二)MS-MPI多机通信

1.关于MPI多机通信 一台计算机处理数据的能力是有限的,MPI的主要作用就是用来实现并行计算机,即将多台主机联机,实现大规模、高性能的计算机机群。我们知道一台计算机同时运行多个进程时,由于计算机资源是共享的,多个进程都会占用一些资源,每个进程运行的效率就会降低,比如当一台计算机同时跑着多个大型应用时会变得非常卡顿。所谓多机通信,可以理解为将本应该在同一台主机上运行的多个进程分配到多台主机上,以往...

xinwuya_的博客 4392

YOLOv8【第十一章:视频追踪与流处理篇·第6节】BoT-SORT 改进:结合相机运动补偿(CMC)提升追踪稳定性!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 719

[翻译] Effective C++, 3rd Edition, 附录 A. 超越 Effective C++

附录 A. 超越 Effective C++作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/Effective C++ 覆盖了我认为对当前的 C++ 程序员最重要的通用指导方针,但是如果你有兴趣在更多的方面提升你的效力,我推荐你去研读我的其他 C++

艺术编程 6445

VxWorks系列 快速导航

Vxworks系列快速阅览导航

Mr.Sugarcane 1309

[翻译] Effective C++, 3rd Edition, 附录 B. 第二和第三版之间的 Item 映射

附录 B. 第二和第三版之间的 Item 映射作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/Effective C++ 的第三版在很多方面与第二版不同,其中最引人注目的是它包含很多新的信息。然而,第二版的大部分内容依然保留在第三版中,虽然经常会改变形式和位置

艺术编程 5819

【3GPP核心网】【5G】史上最全的5G协议规范总结

物理层信道定义:TS38.211(物理层信号的生成、调制,DMRS和额外DMRS,PRACH configuration index,Point A等介绍)传输信道和控制信道的数据处理:TS38.212(包括复用,信道编码,交织,DCI,DMRS端口号等)物理层控制过程:TS38.213(同步,上行功控,随机接入,UE上报和接收控制消息的过程,SSB等)物理层测量:TS38.215(UE和网络的测量控制,UE测量能力)频率、频点相关F R1:TS38.101-1。

风云说通信 3178

RK3399平台开发系列讲解(外设篇)交换芯片RTL8306M

网络:交换芯片RTL8306M 电路: make menuconfig 配置: 目录:arch/arm64/configs/rk3399_b201_defconfig CONFIG_FIXED_PHY=y 设备树: arch/arm64/boot/dts/rockchip/rk3399-b201-rev1.dts 时钟: Open之后首先校验网卡mac地址是否正确(stmmac_chec...

内核笔记 2393

[翻译] Effective C++, 3rd Edition, Item 30: 了解 inlining(内联化)的来龙去脉(下)

(点击此处,接上篇)有时候,即使编译器完全心甘情愿地 inline 一个函数,它们还是会为这个 inline function 生成函数本体。例如,如果你的程序要持有一个 inline function 的地址,编译器通常必然为它生成一个 outlined 函数本体。它们怎么能拿得出一个指向根本不存在的函数的指针呢?再加上编译器一般不会对通过函数指针的调用进行 inlining(内联化)的事实

艺术编程 2732

GPU 资源池化云平台解决方案​

定义与特点Kubernetes是一个开源的容器编排和管理平台,通过提供自动化和声明式的方式来部署、扩展、维护和运行应用程序。它支持跨多个主机和集群部署容器,确保应用程序的高可用性和可扩展性。Kubernetes提供了丰富的功能和插件,允许用户根据自己的需求进行定制和扩展。架构与组件控制平面(Control Plane):负责集群的决策(如调度)和集群状态的检测与响应。

ZhangJiqun&191cm&85kg 1162

[翻译] Effective C++, 3rd Edition, Item 3: 只要可能就用 const

Item 3: 只要可能就用 const作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/关于 const 的一件美妙的事情是它允许你指定一种 semantic(语义上的)约束:一个特定的 object(对象)不应该被修改。而 compilers(编译器)将执行

艺术编程 6679

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[翻译] Effective C++, 3rd Edition, Item 1: 将 C++ 视为语言的联合体

Item 1: 将 C++ 视为 federation of languages(语言联合体)作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/最初,C++ 仅仅是在 C 的基础上附加了一些 object-oriented(面向对象)的特性。C++ 最初

艺术编程 7360

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

[翻译] Effective C++, 3rd Edition, Item 2: 用 consts, enums 和 inlines 取代 #defines

Item 2: 用 consts, enums 和 inlines 取代 #defines作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/这个 Item 改名为“用 compiler(编译器)取代 preprocessor(预处理器)”也许更好一些,因为 #d

艺术编程 6553

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

博客摘录「 [翻译] Effective C++, 3rd Edition, Item 3: 只要可能就用 const」2025年2月27日

因为改变一个返回 built-in type(内建类型)的函数的返回值总是非法的。

qq_44644334的博客 191

博客摘录「 [翻译] Effective C++, 3rd Edition, Item 3: 只要可能就用 const」2025年2月26日

一个 const member function(成员函数)不被允许改变调用它的 object(对象)的任何 non-static data members(非静态数据成员)。

qq_44644334的博客 199

[翻译] Effective C++, 3rd Edition, Item 49: 了解 new-handler 的行为(下)

(点击此处,接上篇)但是也许你依然在为 Widget 从 NewHandlerSupport 继承而烦恼。如果是这样,当你注意到 NewHandlerSupport template 从来没有用到它的 type parameter T 时,你可能会更加烦恼。它不需要那样做。我们需要的全部就是为每一个从 NewHandlerSupport 继承的 class 提供一份不同的 NewHandler

艺术编程 6164

[翻译] Effective C++, 3rd Edition, Item 27: 最少化 casting(强制转型)(上)

Item 27: 最少化 casting(强制转型) 作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/C++ 的规则被设计为保证不会发生类型错误。在理论上,如果你的程序想顺利地通过编译,它就不应该试图针对任何 objects 做任何不安全的或无意义的操作。这是

艺术编程 4239

[翻译] Effective C++, 3rd Edition, Item 49: 了解 new-handler 的行为(上)

Item 49: 了解 new-handler 的行为作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/当 operator new 不能满足一个内存分配请求时,它抛出一个 exception(异常)。很久以前,他返回一个 null pointer(空指

艺术编程 7641

[翻译] Effective C++, 3rd Edition, Item 42: 理解 typename 的两个含义

Item 42: 理解 typename 的两个含义作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同?templateclass T>

艺术编程 7836

[翻译] Effective C++, 3rd Edition, Item 4: 确保 objects(对象)在使用前被初始化

Item 4: 确保 objects(对象)在使用前被初始化作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/C++ 看上去在对象的值的初始化方面变化莫测。例如,如果你这样做,int x;在某些情形下,x 会被初始化(为 0),但是在其它情形下,也可能没

艺术编程 6280

[翻译] Effective C++, 3rd Edition, Item 5: 了解 C++ 为你偷偷地加上和调用了什么函数

Item 5: 了解 C++ 为你偷偷地加上和调用了什么函数作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/一个 empty class(空类)什么时候将不再是 empty class(空类)?答案是当 C++ 搞定了它。如果你自己不声明一个 copy con

艺术编程 5208

[翻译] Effective C++, 3rd Edition, Item 13: 使用 objects(对象)管理资源

Item 13: 使用 objects(对象)管理资源作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/假设我们和一个模拟投资(例如,股票,债券等)的库一起工作,各种各样的投资形式从一个 root class(根类)Investment 继承出来:class

艺术编程 5966

[翻译] Effective C++, 3rd Edition, Item 51: 编写 new 和 delete 时要遵守惯例

Item 51: 编写 new 和 delete 时要遵守惯例作者:Scott Meyers译者:fatalerror99 (iTePubs Nirvana)发布:http://blog.youkuaiyun.com/fatalerror99/Item 50 讲解了什么时候你可能需要编写 operator new 和 operator delete 的你自己的版本,但是没有讲解当你这

艺术编程 6156
上一篇: [翻译] Effective C++, 3rd Edition, Item 29: 争取 exception-safe code(异常安全代码)(下)
下一篇: [翻译] Effective C++, 3rd Edition, Item 30: 了解 inlining(内联化)的来龙去脉(下)
fatalerror99
博客等级 码龄24年 166粉丝 20原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值