[More Effective C++]条款22有关返回值优化的验证结果

31 篇文章 ¥19.90 ¥99.00
本文转自某博客,探讨了《More Effective C++》中条款22关于返回值优化的验证过程。作者不确定结果是否准确,期待专家的验证和确认。注意,此讨论主要涉及编译器优化,与使用操作符复合形式代替独身形式的建议关联较小。

转自:http://blog.sina.com.cn/s/blog_5dbb2c470100xapn.html

不知结果是否正确,有待进一步确认,有没有大神验证过,告诉我结果

(这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大。书生注)


在[More Effective C++]条款22的最后,在返回值的返回方式上,大师Meyers推荐使用表达式[returnT(lhs)+=rhs;]这种使用匿名临时变量的方式,理由是“自古以来未具名对象总是比具名对象更容易被消除”,这种写法将更好地帮助编译器实现返回值优化(ReturnValue Optimization,简写RVO)。

针对上述说法,我在两款编译器上验证了一下(g++ 4.1.2,以下简称g++,及MS Visual C++2008,以下简称vc),结果并不如此。验证分三个阶段,具体结果如下。

(1)(不做加法计算,纯为RVO验证)
return T(lhs);
结果:g++和vc在不开编译优化选项的情况下,都进行了优化。即只会发生一次copy ctor。

(2)
return T(lhs) += rhs;
或者
T temp(lhs);
return temp += rhs;
结果:g++和vc即使开编译优化选项,也不会优化。即发生两次copyctor,分别在temp对象的构造时与return时。

(3)
T temp(lhs);
temp += rhs;
return temp;
结果:g++无论开不开编译优化选项,都会优化,也就是说针对具名对象temp做了优化。结果只发生一次copy ctor。
vc在不开编译优化选项的情况下,不会优化,打开优化选项的情况下(比如release模式下)会做优化。

乍看(2)的第一种写法和(3)的写法对比,会产生奇怪的错觉:(3)的具名对象都可以优化,为什么(2)的匿名临时对象反而不会优化?其实看看(2)的第二种写法就明白了,问题不在于具名对象还是匿名对象,问题在于return语句上附带的操作。

为了搞清楚这个问题,我们需要先来了解一下返回值优化的原理。根据C++标准规定,具名对象也可以经由RVO被优化去除,那么编译器如何优化呢?按照(3)的流程,正常情况下(不优化)应该这样做:
T temp(lhs); 
  //经由copyctor创建一个temp对象
temp += rhs;   //在temp上进行操作
return temp;   //返回temp,即经由copyctor将temp对象复制给外层的一个匿名临时对象(或某具名对象)
当编译器判断出函数的返回值是通过temp返回时,就可以将temp对象优化掉,而把在temp身上做的所有操作直接操做于外层的那个匿名临时变量身上,这样最后return所产生的copy操作就可以省掉了。

而在(2)的第二种写法中,temp就没办法被优化了,因为在return语句中,需要在temp对象上来做一个操作,编译器就只能老老实实的将temp构造出来,再以temp为参数做这个操作(调用相应函数),并将该函数返回结果再做一次copyctor复制出去。(2)的第一种写法原理相同。

这个验证结果带给我们的结论就是,如果你定义了一个专用于存储返回值的临时对象(具名或者匿名),那么在返回的时候不要再做多余的操作。另外,如果存在返回不同具名对象的多个路径,编译器将没办法在编译期确定哪个对象会被作为返回值返回,那么编译器也无法完成返回值优化。还有一件事情需要小心,那就是在某些编译器上(比如vc)根据编译选项的不同程序的行为会不同(除了少调用一次copyctor,还少一次临时变量的析构函数调用)。

当然,在优化这件事上,还需要慎重。为了完成返回值优化而硬写出难于理解的代码,甚至可能是效率更差的代码,就违反了我们的本意了。就像Meyers大师所说的,掌握好80-20原则,以及讲求证据的原则。
源码下载地址: https://pan.quark.cn/s/7a349ad53637 在地理信息系统(GIS)领域中,土地利用现状图被视为一种核心的数据可视化手段,其主要功能在于呈现特定区域的土地使用格局,涵盖农业、住宅、工业、绿地等多样化的土地利用类型。此类信息对于城市规划、环境分析、土地监管以及决策制定具有基础性作用。在编制土地利用现状图的过程中,符号库的构建与样式匹配环节是保障地图具备清晰度、精确性及视觉美感的核心步骤。所谓"样式匹配",是一种技术手段,旨在让用户能够将特定的符号或视觉样式与地图中的数据要素建立关联。在本资源中,提及的"样式匹配lyr"文件或许是一个ArcGIS(一种广受欢迎的GIS软件)所使用的图层样式文件,该文件内含了预设的图例符号及使用规范,用以区分不同的土地利用类别。用户若将此lyr文件导入至个人项目中,便能够迅速为土地利用现状图层赋予统一且专业的视觉表现。符号库则是指存储各类图形符号的集合,这些符号在地图上代表了不同的地理要素。对于土地利用现状图而言,每一类土地通常都会对应一个特定的符号,比如农田可能以绿色填充图案来表现,而建筑用地则可能采用灰色的实心形状。这些符号库对于统一地图的视觉呈现至关重要,有助于观者迅速把握地图所传递的信息。在ArcGIS软件中,用户能够通过"图层属性"界面来调控图层的视觉样式。在该界面中,用户可以选择"符号"面板来设定数据的可视化方式,或选择"标签"面板来管理要素的标注规则。借助"加载样式"功能,用户可以将"样式匹配lyr"文件中的样式规则应用到当前图层,以此规避逐一对每个土地利用类型进行符号的手动配置。不仅如此,为了达成卓越的可视化效果,可能还需对其他图层属性进行微调,例如调节透明度、设置比例尺依赖...
内容概要:本文围绕直流电机转速电流双闭环调速控制系统模型的研究,基于Matlab/Simulink平台实现了系统的建模仿真与动态性能分析。详细阐述了双闭环控制结构的设计原理,重点剖析转速环与电流环的协同控制机制,通过PI控制器实现对电机转矩和转速的精确调节,有效提升系统在负载扰动下的稳定性与响应速度。文中系统介绍了Simulink中各功能模块的搭建方法,包括电机本体模型、电流检测、转速反馈、调节器设计及PWM驱动等环节,并提供了关键参数整定策略与仿真结果验证,全面展示直流电机高性能调速控制的技术路径与工程实现细节。; 适合人群:具备自动控制原理、电力电子技术和Matlab/Simulink仿真基础的电气工程、自动化、机电一体化等专业的本科生、研究生,以及从事电机驱动与运动控制研发的工程技术人员。; 使用场景及目标:①用于高校课程设计、毕业设计或科研项目中直流电机控制系统的仿真建模与性能优化;②为工业现场高性能电机驱动系统的设计与调试提供理论依据与技术参考;③深入掌握双闭环PID控制在电机系统中的工程应用,提升系统动态响应、抗干扰能力和稳态精度。; 阅读建议:建议读者结合文中所述模型结构与参数设置,动手搭建Simulink仿真模型,重点理解内外环控制的耦合关系与PI调节器的动态调节过程,可通过改变负载条件和控制器参数进行对比实验,进一步探究先进控制策略(如自抗扰控制、模糊PID等)的改进潜力。
内容概要:本文系统研究了无人机启用的无线传感器网络中的节能数据收集问题,重点围绕基于Matlab的算法仿真与实现,涵盖了无人机三维路径规划、动态避障、多智能体协同任务分配等核心技术。研究融合多种智能优化算法,如粒子群优化算法(PSO)、灰狼优化算法(GWO)、遗传算法(GA)、Q-learning及混合优化策略,结合动态窗口法(DWA)等局部避障技术,实现复杂环境下无人机高效、低能耗的数据采集路径规划。同时,探讨了多无人机协同、卡车-无人机协同配送等场景下的任务优化模型,旨在提升数据收集效率并最大限度降低系统能耗,确保在满足数据完整性与实时性要求的前提下实现能源节约。; 适合人群:具备Matlab编程基础,从事无人机路径规划、无线传感器网络、智能优化算法、物联网数据采集等领域研究的科研人员、工程技术人员及高校研究生。; 使用场景及目标:①应用于复杂环境下的无人机辅助无线传感器网络数据采集系统设计;②为三维空间中无人机动态避障与节能路径规划提供算法支持与仿真验证;③服务于环境监测、智慧农业、灾害救援、智慧城市等需要低功耗、高可靠性数据收集的实际应用场景;④支持多智能体协同任务分配与优化调度的科研与工程实践。; 阅读建议:建议结合提供的Matlab代码深入实践,重点关注不同优化算法的参数设置、收敛特性及在具体路径规划任务中的表现差异,通过对比分析选择最适合特定应用场景的技术方案,并尝试拓展至更多现实约束条件下的仿真验证
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值