C++编译器对于类对象的优化四

G++编译器的返回值优化 摘自Options Controlling C++ Dialect, Chapter 3.5, Using the GNU Compiler Collection – For GCC version 8.2.0 -fno-elide-constructors The C++ standard allows an implementation to omit creating a temporar... 阅读详情

1、优化规则

接收函数返回值的时候优先使用初始化的方式进行接收,而不是采用赋值的方式
①、假如返回值是个临时变量,采用赋值的方式,首先主调函数内必须先生成一个对象用来接收返回值,此时调用一次构造函数,接收返回值采用赋值,又调用了赋值运算符的重载,赋值完成后临时对象还要析构,到此调用了三次函数。
②、假如采用初始化的方式:那就相当于用临时变量生成一个新对象,注意一旦遇到这种场景,编译器就会进行优化,如下:用生成临时对象的方法构造生成新对象,整个过程只有一次构造函数调用过程,效率大大提高
———————————————————————————————————————————————————————

2、代码

#include<iostream>
using namespace std;
static int g_count = 1;
class test
{
public:
	//构造函数
	test(int p=10){ma = p ; cout<<g_count++<<"  test(int)"<<endl;}
	//析构函数
	~test(){cout<<g_count++<<"  ~test()"<<endl;}
	//拷贝构造函数
	test (const test &p)
	{
		ma = p.ma;
		cout<<g_count++<<"  operator(test)"<<endl;
	}
	//赋值运算符的重载
	test& operator=(const test p)
	{
		ma = p.ma;
		cout<<g_count++<<"  operator = (test)"<<endl;
		return *this;
	}
public:
	int getdata(){return ma;}
private:
	int ma;
};
//test getobj(test t)
test getobj(test &t)
{
	int val = t.getdata();
	//test tmp(val);
	//return tmp;
	return test(val);
}


int main()
{
	test t1;
	//test t2;
	test t2 = getobj(t1);

	return 0;
}

3、运行结果

在这里插入图片描述
到此,整个代码优化完成,由最初的11个函数调用优化到现在的只有4个函数调用

模型算力需求估算 (Billion Parameters,简称B)和训练/推理的计算任务复杂度,结合硬件计算能力(例如每秒浮点运算次数,FLOPS)来估算。以下是详细的方法和公式说明,以及实际的计算示例。算力需求的估算依赖于参数量、模型架构及硬件性能,结合训练/推理场景的特定要求来计算。通过上述公式和示例,我们可以定量分析不同任务的算力需求,并合理配置硬件资源以优化运行效率。结论:推理任务相对较轻,单台H100可以在30秒内完成此任务。推理算力需求一般远低于训练,因为只需要执行前向传播。,可以将训练时间缩短到约。 阅读详情

相关推荐

STM32 Boot程序实战:从启动流程到安全跳转机制解析

本文深入解析STM32 Boot程序的核心作用与安全跳转机制,涵盖启动流程、内存管理、中断向量表重定向及固件验证等关键环节。通过实战案例分享如何实现可靠的固件升级与故障回退策略,避免设备变砖风险,提升嵌入式系统稳定性。

pluto的博客 778

【C++】类对象隐式类型转换与编译器优化深度解析

本文深入探讨C++中类对象的隐式类型转换机制,从C++98的单参数隐式转换到C++11的多参数列表初始化,详细分析其语法规则、使用场景及潜在问题。同时,通过具体代码示例揭示现代编译器在对象构造、传参和返回值方面的优化策略,特别是返回值优化(RVO)的工作原理,为编写高效、安全的C++代码提供重要参考。

2403_88316985的博客 1914

SECS/GEM协议中的关键指令详解:从S1F1到S9F9的完整指南

本文详细解析了SECS/GEM协议中从S1F1到S9F9的关键指令,涵盖设备状态管理、控制诊断、报警处理等核心功能。通过实际案例和调试技巧,帮助开发者掌握半导体制造设备通信标准,解决SECS/GEM协议在实际工程应用中的通讯难题,提升生产线智能化水平。

weixin_26899659的博客 397

C++类对象模型

类对象模型是一种编程概念,用于描述和实现面向对象编程(OOP)中的类和对象。在这个模型中,类定义了对象的结构和行为,包括数据成员(属性)和成员函数(方法)。对象是类的实例,具有类的所有属性和方法。类对象模型支持封装、继承和多态等OOP特性,使得代码更加模块化、可重用和易于维护。通过类对象模型,程序员可以创建复杂的软件系统,提高开发效率和代码质量。类对象的存储方式是按照只保存成员变量,成员函数存放在公共的代码段一个类的大小,实际就是该类中”成员变量”之和,须要注意内存对齐。

qq_74013365的博客 1679

深空探测处理软件USGS-ISIS的下载安装

深空探测处理软件USGS-ISIS下载安装教程

qq_31721595的博客 3310

UWB定位进阶:如何利用DW1000的CIR数据做NLOS信号识别?

本文深入探讨了如何利用DW1000芯片的信道脉冲响应(CIR)数据进行非视距(NLOS)信号识别,以提升UWB定位精度。通过分析CIR数据的核心价值、预处理方法、特征提取技术以及机器学习模型构建,为研究人员和工程师提供了实用的解决方案,帮助克服室内定位中的NLOS挑战。

weixin_28729205的博客 474

深入剖析:C++类对象的内存布局与优化

摘要:在C++编程中,理解类对象的内存布局对于优化内存使用和提高程序性能至关重要。本文将详细介绍C++类对象的内存布局,包括数据成员、虚函数表指针以及静态变量和静态方法在内存中的位置。通过这些知识,我们可以更好地设计和优化我们的类结构。

jianglq的博客 2038

Word2vec核心模型精讲:CBOW与Skip-gram

Word2vec是Google提出的词向量模型,通过CBOW和Skip-gram两种神经网络架构将词汇映射到低维向量空间。CBOW通过上下文预测中心词,训练速度快但高频词表现更好;Skip-gram则相反,通过中心词预测上下文,适合处理生僻词。为解决softmax计算效率问题,Word2vec引入基于哈夫曼树的Hierarchical Softmax优化技术,将复杂度从O(V)降至O(logV)。文章详细解析了两种模型的原理差异,并演示了哈夫曼树的构造过程及其在词向量训练中的关键作用,这种结合词频的优

Trisyp的博客 528

C++ | 探究拷贝对象时的一些编译器优化

揭晓一下拷贝构造过程中你所不知道的一些编译器优化工作🔧

做技术人 · 产优质博客 · 找好工作 1573

WRFDA如何读取风云四号A 星的GIIRS数据?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1025

基于Solidworks的三维光路结构示意图绘制实例演示-技术细节

基于Solidworks的三维光路结构示意图绘制实例演示-技术细节

简单光学 1万+

【C++笔记】C++编译器拷贝优化和内存管理

哈喽,各位小伙伴大家好!上期我们讲了类和对象的收尾。但是还有一个拷贝的编译器优化没讲。今天我们就来讲一下C++拷贝的编译器优化和内存管理。话不多说,咱们进入正题!向大厂冲锋!

大白的编程日记. 2167

电机瞬态分析基础(2):理想电机的基本假设和正方向规定

电机瞬态分析基础之理想电机假设条件和正方向规定

weixin_45670943的博客 1145

从汇编角度看C++优化:编译器真正做了什么

局部优化:在基本块内进行,如常量传播、常量折叠、强度削减。循环优化:循环展开、循环不变代码外提、归纳变量消除。过程间优化:内联展开是其中最关键的,它打破了函数边界。窥孔优化:寻找特定的、低效的指令序列并将其替换为更高效的序列。寄存器分配:智能地将变量分配到有限的CPU寄存器中,减少内存访问。自动向量化:在支持SIMD指令的CPU上,将循环中的标量操作转换为并行向量操作。

码事漫谈 1724

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++ 编译器优化与SIMD指令集

刚才提到了 xmm 这个系列的寄存器,它们都有128128128位宽,可以容纳444个 float 或者222个 double。刚才的例子中,因为只有一个 float 存在一个128128128位的寄存器内,所以只用到了它最低的323232位。但是这样也没问题,因为我们刚才说的是,addss 它只会加最低位。这就要说到下一节将提到的 addss 了。刚才提到外部函数会让编译器无法优化,但如果是内部函数呢?内部函数是声明和定义在同一个文件,就是它定义在 func 调用它的相同文件。

泠山的博客 6892

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++编译器对于类对象的优化一

综上,一共产生了四次函数调用,因为函数调用会产生很多的堆栈,消耗资源较大,编译器进行优化后,只剩下两个函数调用,大大减少了因函数调用而产生的堆栈的开辟和回收。3、因为临时对象的生存周期就是在本行,所以本行执行完毕后会调用析构函数去析构临时对象;用临时对象生成新对象的时候,临时对象被优化掉了,直接按照生成临时对象的方法生成新对象。本行代码,若是不优化的话应该这样调用。1、test(100) , 调用构造函数,构造一个临时变量。2、调用赋值运算符的重载,将上面生成的临时变量赋给 b;

doubleintfloat的博客 568

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++中返回值为 类对象 详解

C++中返回值为 类对象 详解 代码如下: #include <iostream> using namespace std; //建一个Test类 class Test { public: Test() { a = 0; b = 0; cout << "无参构造函数被调用了" << endl; } Test(int aa, int bb) { a = aa; b = bb; cout << "有参构造函数被调用了" <&

abc 3458

Cppfront项目解析:探索下一代C++语法Cpp2的实验性编译器

C++作为一门历史悠久的编程语言,其语法复杂性一直是开发者们讨论的焦点。Cppfront项目正是为了解决这一问题而诞生的实验性项目,它提出了"C++语法2"(简称Cpp2)的概念,并提供了首个实现这一语法的编译器cppfront。 ## 项目核心概念 ### 什么是Cpp2? Cpp2是C++的一种替代语法设计,旨在提供: - 更简洁的代码表达方式 - 更强的类型安全性 - 更直观的语义表达...

gitblog_00137的博客 734

编译器优化

编译器我们大家都爱吃,但是编译器在编译过程中会偷偷做一些事让程序跑的更快,代码体积更小,称之为编译器优化。这篇文章是一个总览,从编译器角度介绍优化的原理,从开发角度介绍做法。

qq_42370809的博客 1835

《 C++ 点滴漫谈: 十七 》编译器优化与 C++ volatile:看似简单却不容小觑

本文深入探讨了 C++ 中的 volatile 关键字,全面解析其基本概念、典型用途以及在现代编程中的实际意义。通过剖析 volatile 的核心功能,我们了解了它如何避免编译器优化对硬件交互和多线程环境中变量访问的干扰。同时,文章分析了 volatile 的局限性,如缺乏线程安全保障,并介绍了 C++ 中的现代替代方案,包括 std::atomic 和内存模型。此外,本文还总结了 volatile 使用中的常见误区和陷阱,提供了实际应用场景和实践建议。无论您是初学者还是资深开发者,都能通过本文掌握 vol

Lenyiin 2604

Visual studio 的C++编译器

最近研究了一下linux下面的C++编程,在命令行中进行编译C++代码;使用的是gcc编译器并最终生成 并对比visual stuio式那种傻瓜式的IDE,发现了Debug与Release的本质,项目属性中 最终生成还是命令,在dos中进行执行,编译后,链接的。   所以,想成为C++高手,不能被微软骗了,这就是哲学上说的要能够透过现象看本质吧 ,现在明白编译原理的应用在哪儿了,编译器是

Aletenze的专栏 1万+

C/C++代码性能优化——编译器和CPU

在现代软件开发中,性能优化至关重要,尤其是在资源受限的系统和处理大量数据的应用程序中。C/C++ 作为低级编程语言,提供了对底层硬件的直接访问,使其成为性能关键应用程序的理想选择。然而,编写高效的 C/C++ 代码是一项具有挑战性的任务,需要对语言特性、编译器优化、硬件架构、数据结构和算法有深入的理解。本文旨在为 C/C++ 程序员提供一个全面的指南,涵盖各种优化技术,以提高代码性能,重在指南引导,不讲细节。

飞鹤的程序员人生 4508

揭秘C++编译器如何优化对象拷贝

本文主要探讨现代C++编译器在函数传参和返回值处理中的优化机制。通过示例代码展示了传值传参、隐式转换、显式构造等场景下的优化效果,以及不同编译器(如G++、VS2019/2022)在返回值优化(RVO/NRVO)上的差异。文章指出编译器优化虽能显著提升性能,但因其实现存在差异,开发者不应过度依赖特定优化行为。建议在调试时关闭优化选项观察完整生命周期,在性能关键场景可结合C++11移动语义等特性明确控制对象传递行为。

祯的博客 968

最好的 Windows C++ 编译器!

在技术不断更迭的软件开发世界中,市场上 C++ 编译器的数量开始持续呈现下降趋势。而随着新的高级 C++ 标准(C++ 17、C++ 20)、新的指令集扩展、以及代码优化的更高标准的出现,究竟什么样的编译器才算优秀? 作者|Agner 译者 | 苏本如,责编 |屠敏 出品 | 优快云(ID:优快云news) 以下为译文: 近年来,市场上C++编译器的数量有所下降。一些...

优快云资讯 9014

深入探讨 C++ 中的编译器优化类型

编译器优化是提升 C++ 程序性能的重要手段。通过了解不同类型的编译器优化,程序员可以更有效地编写高效的代码。合理利用编译器选项、遵循最佳实践以及使用性能分析工具,将有助于开发出更高效的 C++ 应用程序。希望本文能为您在 C++ 编程中优化性能提供实用的指导和启发。通过掌握编译器优化的知识,您将能够编写出更高效、更优雅的代码。

铭渊老黄 1298

C++编译器优化问题

首先使用a拷贝构造了形参aa,然后aa拷贝构造了copy1,copy1拷贝构造了copy2(注意这里虽然是等号也是拷贝构造,因为这里的copy2还是对象创建初始化阶段,只有对象创建出来之后再给对象赋值才是赋值)copy2拷贝构造了一个临时对象然后传参给test,使用这个临时对象1拷贝构造了aa然后aa重复上面再函数中的拷贝构造,返回值,因为是值返回所以先再main函数的栈帧内开辟一个临时对象2,调用了一次拷贝构造,然后再用哦这个临时对象2,拷贝构造了ret对象。所以编译器进行了优化,那么优化的地方在哪呢?.

qq_62745420的博客 1509
上一篇: C++编译器对于类对象的优化三
下一篇: C++ 类对象传参数和返回值的构造析构调用过程
越甲八千
博客等级 码龄11年 2953粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值