C++对象拷贝时的优化编译

在现代编译器中,当我们在 C++中进行对象的拷贝操作时,编译器并非只是机械地执行逐字节的复制。相反,它会进行优化,避免不必要的拷贝构造等等,这种优化包括“返回值优化”(RVO),“拷贝省略” 等等。以下代码运行结果是在vs2022下实现的。

#include<iostream>
using namespace std;class A
{
public:A(int a = 0):_a1(a){cout << "A(int a)" << endl;}//拷贝构造A(const A& aa):_a1(aa._a1){cout << "A(const A& aa)" << endl;}A& operator=(const A& aa){cout << "A& operator=(const A& aa)" << endl;if (this != &aa){_a1 = aa._a1;}return *this;}//析构~A(){cout << "~A()" << endl;}
private:int _a1 = 1;
};
void f1(A aa)
{}
A f2()
{A aa;return aa;
}

1.内置类型转换为自定义类型的优化

int main()
{A aa = 1;return 0;
}

    在语法上来看,也就是没有优化的情况下,(1)编译器先调用默认构造函数,在栈上创建临时对象,传入参数值1初始化临时对象的成员变量,(2)再将这个临时对象去拷贝构造给aa,(3)aa被初始化成功后析构这个临时对象,(4)等到程序结束时再析构aa

    从下面的结果来看,也就是优化之后,并没有调用拷贝构造,(1)编译器可能直接调用默认构造函数初始化aa,而不创建临时对象和调用拷贝参数,(2)然后在程序结束时析构aa。

2.传值传参时的优化

void f1(A aa)
{}
int main()
{A aa1;f1(aa1);retrun 0;
}

从语法上看,(1)当执行A aa1时,编译器会调用A类的默认构造函数。由于没有提供参数,默认构造函数A(int n = 0)会被调用,_a1被初始化为0。(2)随后执行f1(aa1),编译器会调用A类拷贝构造函数将aa1的值拷贝到临时对象aa中,(3)然后进入函数f1, 该函数结束时调用析构函数析构aa,(4)最后main函数结束时析构aa1。从结果上来看,此处没有优化。

3.隐式类型

void f1(A aa)
{}
int main()
{	//隐式类型,连续构造+拷⻉构造->优化为直接构造f1(1);return 0;
}

从语法上来看,(1)当调用f1(1)时,编译器调用A的默认构造函数将整数1隐式转换为A类对象(2)进入函数f1,由于f1的参数是按值传递的,A类的临时对象aa被创建,并且刚刚创建的对象会被拷贝构造到临时对象aa中,(3)当函数f1结束时,析构aa。当main函数结束时,此处由于没有其它对象,所以没有再调用析构函数。

优化过之后,(1)编辑器可能直接会直接在f1的参数位置调用默认构造函数,使用参数1进行构造,(2)而不是先创建一个临时对象再拷贝,因此没有拷贝构造。(3)在f1内部,aa直接引用构造函数,到函数f1结束时,析构aa。得到了下面的结果                                                                                                                                                   

4.传值返回

A f2()
{A aa;return aa;
}
int main()
{// 传值返回// 返回时⼀个表达式中,连续拷⻉构造+拷⻉构造->优化⼀个拷⻉构造 (vs2019 debug)// ⼀些编译器会优化得更厉害,进⾏跨⾏合并优化,直接变为构造。(vs2022 debug)//构造+拷贝构造-》直接构造A aa2 = f2();
}

从语法上来看,(1)当调用A aa2 = f2();时,程序进入f2函数,首先创建局部对象aa,调用默认构造函数初始化aa,(2)返回时会触发拷贝构造函数,创建一个临时对象用于返回值传递,(3)在main函数中临时对象初始化aa2再次触发拷贝构造,(4)当f2函数执行完毕,编译器会调用aa的析构函数,(5)当main函数结束时调用aa2的析构函数

优化后,(1)在函数f2中调用了默认构造函数创建一个A类对象aa2,(2)从结果上来看,编译器可能是只创建了aa2,将aa类似一个指针的效果指向aa2,因此只在在main函数结束时调用了析构函数析构aa2,而没有析构aa

A f2()
{A aa;cout << &aa2 << endl;return aa;
}
int main()
{cout << &aa2 << endl;A aa2 = f2();
}	

从下面的图中我们可以看到,aa和aa2的地址是相同的。 

这篇文章主要目的是为了介绍编译器的对代码的优化,以及学习程序运行的语法,可能有表述不严谨的地方,欢迎大家探讨纠正。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

电脑的主板,内存条插多少合适?

首先&#xff0c;不是插满4条内存就是最好的。 内存条插得多&#xff0c;确实可以扩充容量&#xff0c;提升性能。但是有些低端的主板配低端CPU&#xff0c;插满4条内存&#xff0c;稳定性下降。这里的稳定性包括供电&#xff0c;单独的内存供电容量等。此时CPU会通过降低内存…

Weapons Armor PBR Pack 1 - Fantasy RPG 武器护甲游戏模型

武器和护甲包#1有30个武器和护甲,每个对象都有默认外观,大多数都有网格变形和Substance Painter源文件,用于自定义纹理。 无限PBR&我的哲学 Infinity PBR是十几位艺术家的作品,他们都在做自己最擅长的事情。我想为独立游戏开发者制作最通用、最优质的资产,按照我希望的…

大数据新视界 --大数据大厂之数据驱动决策:如何利用大数据提升企业竞争力

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

MySQL之内置函数

目录 一&#xff1a;日期函数 二:字符串函数 三&#xff1a;数学函数 四&#xff1a;其他函数 一&#xff1a;日期函数 举例: (1) mysql> select current_date(); ---------------- | current_date() | ---------------- | 2024-09-17 | ---------------- 1 row …

了解云容器实例云容器实例(Cloud Container Instance)

1.什么是云容器实例&#xff1f; 云容器实例&#xff08;Cloud Container Instance&#xff0c; CCI&#xff09;服务提供 Serverless Container&#xff08;无服务器容器&#xff09;引擎&#xff0c;让您无需创建和管理服务器集群即可直接运行容器。 Serverless是一种架构理念…

中秋节程序员一般在干啥?

中秋节作为一个传统的中国节日&#xff0c;主要庆祝活动围绕着家庭团聚、赏月、吃月饼等文化习俗展开。然而&#xff0c;对于程序员这个职业群体来说&#xff0c;他们的中秋节活动可能因工作性质和个人安排而有所不同。但大致上&#xff0c;程序员在中秋节期间可能会有以下几种…

SpaceX实现人类首次商业太空行走:航天历史新篇章

导语 2023年9月&#xff0c;SpaceX成功完成了人类历史上首次商业太空行走&#xff0c;这不仅是航天领域的重要突破&#xff0c;也是商业航天的一次重大胜利。这一事件标志着普通人离太空更近了一步&#xff0c;为未来的太空探索和火星移民奠定了基础。 一、背景介绍&#xff1a…

【C++二叉树】102.二叉树的层序遍历

107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 思路分析&#xff1a; 层序遍历&#xff0c;但是要注意输出的结果是一个二维数组&#xff0c;不是一层一个值一个值的输出&#xff0c;而是要一层一层的输出。可以通过一个循环控制每一层的数据个数&#xff…

2-97 基于matlab的小波变换模量最大值 (WTMM) 方法进行图像边缘检测

基于matlab的小波变换模量最大值 &#xff08;WTMM&#xff09; 方法进行图像边缘检测。利用小波基函数的局部化和振荡特性来检测图像中的边缘&#xff0c;沿每个像素的梯度方向搜索局部最大值&#xff0c;保留局部最大值&#xff0c;抑制其他系数&#xff0c;实现边缘检测。程…

C++11(4)

万众瞩目的C11特辑来了&#xff0c;本章将继续讲解C11更新的内容&#xff0c;不过C11的内容也快接近尾声了。 目录 10。lambda表达式 11。lambda捕捉列表[] 捕捉列表说明 lambda捕捉列表实际应用 10。lambda表达式 #include<iostream> using namespace std; #inclu…

安装WINDOWS微软商店已下架的WSL系统,以UBUNTU 16.04 为例

下载WSL系统 方法1&#xff1a;POWERSHELL 用powershell下载 PowerShell Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1604 -OutFile Ubuntu.appx -UseBasicParsing 1 如果下载时间很长&#xff0c;可以这样把进度条关闭&#xff1a; $ProgressPreference Silentl…

iKuai使用及设置流程

iKuai使用及设置流程 iKuai安装步骤 一、配置主机 1.电脑连接ETH0网口 2.ETH1网口连接猫上面的千兆口 3.手动配置pc的IP地址和192.168.1.1./24在同一网段 3.浏览器输入192.168.1.1 admin admin 二、外网设置 1.直接联通电信网络设置 2.点击 网络设置-内外网设置-点击接…

【网络安全】逻辑漏洞之购买商品

未经授权,不得转载。 文章目录 正文正文 电子商务平台的核心功能,即购买商品功能。因为在这个场景下,任何功能错误都有可能对平台产生重大影响,特别是与商品价格和数量有关的问题。 将商品添加到购物车时拦截请求: 请求包的参数: 解码参数后,并没有发现价格相关的参数,…

IDC JAVA语言搭建教程

程序搭建环境&#xff1a;Linux系统CentOS7.6、宝塔、PHP7.2、MySQL5.6&#xff0c;根目录public&#xff0c;伪静态thinkPHP&#xff0c;开启SSL 安装&#xff1a; yum -y install build-essential QQ1594457675 安装&#xff1a;更多依赖包 yum -y install gcc automake …

java编程行业特点

Java编程行业是一个庞大且充满活力的领域&#xff0c;它涵盖了从桌面应用到企业级应用、从Web开发到移动应用、从大数据处理到云计算服务的广泛范围。Java作为一种跨平台、面向对象的编程语言&#xff0c;自1995年发布以来&#xff0c;一直受到全球开发者的青睐&#xff0c;并在…

【网络安全】Google Dorks+Wayback Machine实现敏感数据泄露

未经许可,不得转载。 文章目录 正文正文 Dork搜索: site: privateprogram.com/webapp/经后续挖掘,我发现了一个专门用于存储用户订单的子域和其中一条链接: https://orders.privateprogram.com/webapp/wcs/stores/servlet/OrderView?orderId=002233893但是访问后返回错…

Qt优秀开源项目之二十三:QSimpleUpdater

QSimpleUpdater是开源的自动升级模块&#xff0c;用于检测、下载和安装更新。 github地址&#xff1a;https://github.com/alex-spataru/QSimpleUpdater QSimpleUpdater目前Star不多&#xff08;911个&#xff09;&#xff0c;但已在很多开源项目看到其身影&#xff0c;比如Not…

关于 Regshot 软件

https://github.com/skydive241/Regshot-Advanced#Regshot 3.0.0 1 1.9 版本很多配置没有界面&#xff0c;3.0 把它们都展示到界面上。 2 生成 .au3 好像只能用于安装或卸载软件 3 对于手动修改注册表&#xff0c;会输出 .reg 和 .cmd 等。 对于软件安装&#xff0c;输出有异…

markdown 使用技巧

文章目录 markdown使用技巧1.标题快捷键设置2.文档可读性设置 markdown使用技巧 1.标题快捷键设置 ctl 1:一级标题 ctl 2:二级标题 ctl 3:三级标题 ctl 4:四级标题 ...2.文档可读性设置 输入~~~pro 可选择代码框&#xff0c;并且可以选择不同的字体 ctrl shift ] : 可…

实时数仓3.0DWD层

实时数仓3.0DWD层 DWD层设计要点&#xff1a;9.1 流量域未经加工的事务事实表9.1.1 主要任务9.1.2 思路9.1.3 图解9.1.4 代码 9.2 流量域独立访客事务事实表9.2.1 主要任务9.2.2 思路分析9.2.3 图解9.2.4 代码 9.3 流量域用户跳出事务事实表9.3.1 主要任务9.3.2 思路分析9.3.3 …