编译器的优化问题(构造、拷贝)、linux如何取消优化。

news2024/10/5 17:28:13

 编译器优化问题:

不同编译器优化是不一样的,下面代码我都用的vs2019,并且在Debud模式下。(Release也会进行优化)

下面测试的时候我先采用Debug模式测试。

先写一个简单的类,进行打印测试:

class A
{

public:
	A()
	{
		cout << "A()" << endl;
	}

	A(const A& a)
	{
		cout << "A(const A& a)" << endl;
	}

	A& operator=(const A& a)
	{
		cout << "A& operator=(const A& a)" << endl;
        
        return *this;
	}


	~A()
	{
		cout << "~A()" << endl;
	}
};

下面代码运行的话,会打印几次构造?几次拷贝?

void f1(A a)
{

}

int main()
{
	A a1;
    f1(a1);

	return 0;
}

首先 a1 肯定构造这是一次构造没问题,那么 a1 传给 f1() 是什么呢?

 这里 a1 传给 f1 的时候发生了拷贝,不是 a1 直接给 a,而是中间产生了一个临时变量 a1 先拷贝给临时变量,然后临时变量再传给了 a,下面画图解释:

所以打印出来是 1次构造+1次拷贝。 

那么下面这个代码呢?几次构造,几次拷贝?

void f2(A& a)
{

}

int main()
{
	A a1;
	f2(a1);

	return 0;
}

注意看这里的 f2() 函数里面的形参我加了引用!再结合前面我发的引用结合一下,所以这里应该是几次构造?几次拷贝?

答案:1次构造+0次拷贝,打印看一下:

那么为什么呢?结合前面写的关于引用的文章,引用做参数可以减少拷贝,提高效率。

增加难度,下面结合匿名对象来看编译器是如何优化的。

下面代码运行之后几次构造,几次拷贝构造?

void f1(A a)
{

}

int main()
{

	f1(A());

	return 0;
}

这里运行之后是 1次构造+0次拷贝构造,运行结果如下:

 

但是,那么不优化是什么呢?

不优化的话是 1次构造+1次拷贝。优化因为构造好了之后,再传给 f1 的时候,发生了优化,编译器直接合二为一,优化掉了拷贝。

结论:连续一个表达式步骤中,连续构造一般都会优化,合二为一。(这里还牵扯栈帧方面的知识)

那么再继续,下面代码几次构造,几次拷贝?

A f3()
{
	A ret;
	return ret;
}

int main()
{

	f3();

	return 0;
}

答案:1次构造+1次拷贝。

首先 f3 函数内部 A 先构造了一个 ret 对象没问题吧,那么拷贝哪里来的?还是一样结合前面的,这里返回是传值返回,返回的时候先拷贝给临时对象,然后这个临时对象在返回给调用 f3 的地方,所以发生了拷贝。

那么为什么不用引用返回减少拷贝?

这里的 ret 是局部对象,出了 f3 的域就销毁了,你再想通过引用去找那么访问的就是随机值。

那么继续,下面代码几次构造,几次拷贝?

A f3()
{
	A ret;
	return ret;
}

int main()
{

	A a = f3();


	return 0;
}

答案:优化之后: 1次构造+1次拷贝,那么不优化呢?
不优化是1次构造+2次拷贝,为什么呢?

结合上面的例子,这里两次拷贝应该不难,优化之后,编译器就好比直接通过拷贝一次临时对象传给了a(这里牵扯栈帧的知识)

下面难道再提升,下面代码几次构造,几次拷贝?

A f4(A a)
{
	A a1(a);
	A a2(a1);

	return a2;
}

int main()
{
	A aa;

	A aa1 = f4(aa);

	return 0;
}

 答案:优化之后,1次构造+4次拷贝;不优化是1次构造+5次拷贝,原因如下:

 绿色的线是优化之后的,蓝色是没优化的时候,这里编译器优化处理了,通过一次临时对象拷贝给了 aa1。

那么继续,下面代码几次构造,几次拷贝?

A f4(A a)
{
	A a1(a);
	A a2(a1);

	return a2;
}

int main()
{
	A aa;

	A aa1 = f4(f4(aa));

	return 0;
}

答案:优化之后是1次构造+7次拷贝;不优化是1次构造+9次拷贝。原因如下:

优化之后的:

 

 不优化之后的:

 这个就是编译器优化之后和优化之前的对比,编译器优化依不同编译器不同不一样,linux环境下也是不一样,linux可以加参数取消优化,加的参数是 -fno-elide-constructors 这个参数加一下可以运行看一下结果,我就举最后一个例子试一下,如下:

运行结果如下:1次构造+9次拷贝 

 以上就是编译器优化的例子,根据不同场景不同编译器优化也是不一样的。

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

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

相关文章

从血缘进化论的角度,破解婆媳关系的世纪难题

从血缘进化论的角度&#xff0c;破解婆媳关系的世纪难题 有个粉丝的留言&#xff0c;很长很复杂&#xff0c;是关于他们家的婆媳关系问题。 青木老师&#xff0c;您好&#xff0c;我也有一些问题想咨询您&#xff0c;是关于婆媳关系的&#xff0c;字数有些多&#xff0c;分开…

多线程【线程概念+线程控制】

前置知识 在谈多进程之前&#xff0c;我们在谈一谈页表&#xff0c;在语言中:char* str”hello world”; *str”H”;运行时会报错&#xff0c;原因在于&#xff1a;字符串在已初始化数据区和代码区之间的&#xff0c;需要写的时候&#xff0c;我们需要对str进行虚拟地址和物理…

springboot第17集:Spring我的春天

Spring是一个开源免费的框架和容器&#xff0c;具有轻量级和非侵入式的特点。它支持控制反转(IoC)和面向切面(AOP)&#xff0c;同时提供了对事务和其他框架的支持。因此&#xff0c;简单来说&#xff0c;Spring就是一个轻量级的IoC和AOP容器框架。 假设有一个应用程序需要使用数…

【Golang】多线程爬虫的实现

〇、前言 Golang 是一种并发友好的语言&#xff0c;使用 goroutines 和 channels 可以轻松地实现多线程爬虫。具体地说&#xff0c;实现的是多协程。协程是一种比线程更轻量化的最小逻辑可运行单位&#xff0c;它不受操作系统调度&#xff0c;由用户调度。因此对于协程并发的控…

突发!ChatGPT王炸级更新!支持GPT-4联网 Code Interpreter!

4月30日&#xff0c;OpenAI官方悄悄发布了联网版GPT-3.5。虽然名字变了&#xff0c;但使用体验却是换汤不换药&#xff0c;还是那套。 然而&#xff0c;万万没想到的是&#xff0c;刚过去没几天&#xff0c;昨天5月4日&#xff0c;鱼哥发现自己的Plus账号竟然多了一些能力&…

AI 视频编辑革新:GEN-1 / GEN-2 引领新风潮

在早先的一篇文章中《AI 学习心得速览&#xff08;3月&#xff09;》&#xff0c;提到过一家AI视频公司RunWay&#xff0c;公司专注于 AI 视频处理&#xff0c;在二月份发布了第一个人工智能视频编辑模型 Gen-1&#xff0c;对视频素材进行转换成相应的风格。 RunwayML 今天来聊…

C#学习系列之throw new ApplicationException

C#学习系列之throw new ApplicationException 啰嗦问题解决总结 啰嗦 在项目的解码过程中使用到throw new ApplicationException语句&#xff0c;之前一致没有意识到这句话会带来很多问题。项目中使用这句话来捕捉解码过程中的解码异常问题。 问题 在使用throw new Applicati…

(二)【平衡小车制作】电机驱动(超详解)

一、硬件设计 1.直流减速电机   直流减速电机&#xff0c;即齿轮减速电机&#xff0c;是在普通直流电机的基础上&#xff0c;加上配套齿轮减速箱。齿轮减速箱的作用是&#xff0c;提供较低的转速&#xff0c;较大的力矩。  简单的来说&#xff0c;STM32分配两个IO口给一个…

LeetCoed 2, 23, 25, 112, 113

文章目录 1. 两数相加2. K 个一组翻转链表3. 合并 K 个升序链表4. 路径总和I5. 路径总和II 1. 两数相加 题目详情见: LeetCode2. 两数相加 题目描述相对来说比较绕, 我们可以直接理解为两个多位的整数相加, 只不过整数的每一位都是通过链表进行存储; 比如, 整数 342, 通过链表…

使用Webpack搭建项目(vue篇)

本篇承接使用Webpack搭建项目&#xff08;react篇&#xff09; 由于大部分配置一样&#xff0c;我们从上一篇react项目中&#xff0c;复制webpack.dev.js以及webpack.prod.js 开发模式 1.删除ReactRefreshWebpackPlugin 2.自动补充拓展名修改为.vue文件&#xff0c;同时处理…

每天一道算法练习题--Day21 第一章 --算法专题 --- ----------位运算

我这里总结了几道位运算的题目分享给大家&#xff0c;分别是 136 和 137&#xff0c; 260 和 645&#xff0c; 总共加起来四道题。 四道题全部都是位运算的套路&#xff0c;如果你想练习位运算的话&#xff0c;不要错过哦&#xff5e;&#xff5e; 前菜 开始之前我们先了解下…

【linux的学习与软件安装】

文章目录 linux的学习一、工具安装与联网&#xff1f;二、Linux软件安装1.安装jdk2.安装MySQL安装redis linux的学习 一、工具安装与联网&#xff1f; 1.1安装好VM后 进入vi /etc/sysconfig/network-scripts/ifcfg-ens33 然后ip addr 查看ip 1.2打开IDEA的tools 二、Linux软…

网络编程 | 多进程多线程并发服务器代码实现

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

5.5 Mybatis Update标签实战,返回值是什么? 教你通常处理做法

本文目录 前言一、update标签实战① 在UserMapper接口中新增update方法② MybatisX插件生成update标签③ 写update SQL 语句 二、update sql返回值是什么?三、Mybatis update标签返回值是什么?四、实现简易的修改密码API1. dal层2. service层3. web层自测通过 五、Git提交最后…

vue - 常见的移动端rem适配方案

移动端rem适配方案 rem适配原理方案1&#xff1a;rem媒体查询方案2&#xff1a;jsrem方案3&#xff1a;vwrem&#xff08;不用查询屏幕宽度&#xff09; 移动端适配经常使用的就是 rem; 主要有以下几种方案&#xff1a; 1&#xff1a;rem 媒体查询&#xff08;media&#xff0…

蓝桥杯最后一战

目录 分巧克力_二分 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码&#xff1a; 巧克力 - 优先队列 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码&#xff1a; 思路分析&#xff1a; 秘密行动_dp 蓝桥杯算法提高-秘密行动 题目描述 …

Unity之OpenXR+XR Interaction Toolkit 安装和配置

前言 XR Interaction Toolkit 是Unity基于OpenXR标准&#xff0c;发布的一套XR工具&#xff0c;目的是方便我们快速接入XR相关的SDK&#xff0c;并且做到兼容不同VR设备的目的&#xff0c;目前流行的VR设备如Oculus&#xff0c;Metal&#xff0c;HTC Vive&#xff0c;Pico等统…

改进YOLOv8 | 主干网络篇 | YOLOv8 更换骨干网络之 MobileNetV3 | 《搜寻 MobileNetV3》

论文地址:https://arxiv.org/abs/1905.02244 代码地址:https://github.com/xiaolai-sqlai/mobilenetv3 我们展示了基于互补搜索技术和新颖架构设计相结合的下一代 MobileNets。MobileNetV3通过结合硬件感知网络架构搜索(NAS)和 NetAdapt算法对移动设计如何协同工作,利用互…

【天秤座区块链】元宇宙知识普以及简单解读清华研究报告

本节目录 温馨提示关于分栏【天秤座区块链】由来提前感受元宇宙区块链的两个注意点区块链革命简单认识清华大学报告解读&#xff08;元宇宙&#xff09;前传《雪崩》元宇宙具体是什么&#xff1f;元宇宙不是什么&#xff1f;那为什么要冲击元宇宙呢&#xff1f; 小补充及感谢 温…

前端搭建打字通游戏(内附源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 打字通功能介绍✨ 页面搭建✨ 样式代码✨ 功能实现 ✨ 写在前面 上周我们实通过前端基础实现了名言生成器&#xff0c;当然很多伙伴再评论区提出了想法&#xff0c;后续我们会考虑实现的&#xff0c;今天还是继续按照我们…