编译时间和运行态时间交换的优缺点

news2024/11/19 1:26:27

前言

(1)前几天,我刷视频无意之间看到一个视频说,sizeof(a++),这个a是会自增吗?
(2)如果有经验的人肯定会说,不会自增,这是常识。那么将这句话转化为汇编之后会发生什么呢?为什么a不会进行自增呢?

将sizeof(a++)转换为汇编

(1)既然我们要探究为什么sizeof(a++)中的a不会进行自增,那么最好的办法就是,将C语言转换成汇编,看看最终执行效果。

在这里插入图片描述

(2)这是为什么呢?我去查阅了C语言标准,其中有这么一段话:
When applied to an expression, sizeof does not evaluate the expression (i.e. the expression is an unevaluated operand) (since C++11), and even if the expression designates a polymorphic object, the result is the size of the static type of the expression. Lvalue-to-rvalue, array-to-pointer, or function-to-pointer conversions are not performed. Temporary materialization, however, is (formally) performed for prvalue arguments: the program is ill-formed if the argument is not destructible. (since C++17)
翻译结果:当应用于表达式时,sizeof不计算表达式 (即表达式是未计算的操作数) (C++11 起),并且即使表达式指定多态对象,结果也是表达式的静态类型的大小。不执行左值到右值、数组到指针或函数到指针的转换。然而,临时物化(正式)是对纯右值参数执行的:如果参数不可破坏,则程序是格式错误的。 (自 C++17 起)
(3)由此可见,C语言标准决定了sizeof之后的式子是不会进行任何的计算的。

为什么sizeof后面的式子不进行计算

用编译器的时间换运行态的时间

(1)这个时候可能有人就会有疑问了。为什么sizeof后面的式子不进行计算呢?
(2)通过和大佬们交流,我得知了一个名词,叫做用编译器的时间换运行态的时间
(3)这个时候可能有人就有疑惑了。编译器时间是什么呢?运行态时间又是什么呢?我在stack overflow上找到了非常好的解释。
<1>编译时:您(开发人员)编译代码的时间段。
<2>运行时间:用户运行您的软件的时间段。
(4)当你调用sizeof 的时候,核心目的是为了知道这个变量所占几个字节。那么,==一个数据,进行自增或者自减,是不会影响到他的类型的,他占据几个字节也不会有影响。==所以为了提高代码执行速度,我们可以只进行判断变量a 的所占字节即可,他的运算是可有可无的。

时间交换可能会产生的不良后果

(1)现在,我们知道了可以使用编译器时间来换取运行时间,来提高用户体验,那么这样做,真的就非常完美了吗?
(2)答案肯定是不,为什么呢?因为,想单片机程序,如果我想让一个单片机进行一个1ms的延时。于是我就让变量a进行不断的自增,最终实现延时效果。

 //假设这是一个延时1ms的程序
void delay(void)
{
	int a;
	for(a=0;a<50000;a++);
}

(3)但是,如果是玩过MSP430的同学就会发现,不对,有问题。这个并没有延时效果,我们会需要调整编译器优化等级才可能出现延时效果。
(4)这是为什么呢?原因很简单,如果你编译器优化等级过高,而编译器发现for(a=0;a<50000;a++);这个语句什么都没做,可能就会放弃掉这个语句。最终导致无法产生想要的延时效果。
(5)编译器除了放弃一些认为不用的程序以外,还做了什么吗?举个例子,假如一个程序里面有一个运算式子:a = 2+2+4 ,那么编译器会直接将2+2+4计算出来,并且将8传给a。这样就能够降低运行状态的时间,提高用户体验。

总结

(1)sizeof(a++)这个运算式子算是编译器时间换运行态时间的一种方式,这样做能够提高用户体验。
(2)但是,有可能程序员一开始的目标就是要用来延时的,所以容易产产生负面效果。
(3)因此,我们应该对这个有充分的了解。根据需求做决定。

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

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

相关文章

GLP-1爆火2023:神药显雏形,争夺引内卷

2023年过半&#xff0c;如果要从创新药角度做一份总结&#xff0c;什么赛道、哪类药物会是“当红炸子鸡”&#xff1f;答案一定是GLP-1类药物。 原本用于治疗二型糖尿病的药物&#xff0c;在国内社交媒体上&#xff0c;关于司美格鲁肽的减肥奇效&#xff0c;甚至引发了一股抢药…

GBDT算法原理以及实例理解(含Python代码简单实现版)

一、算法简介&#xff1a; GBDT 的全称是 Gradient Boosting Decision Tree&#xff0c;梯度提升树&#xff0c;在传统机器学习算法中&#xff0c;GBDT算的上是TOP前三的算法。 想要理解GBDT的真正意义&#xff0c;那就必须理解GBDT中的Gradient Boosting和Decision Tree分别…

python开发构建基于国家气象台免费免费数据查询接口的气象数据采集与可视化分析应用

天气气象数据是用于描述和记录大气环境状态和变化的数据。它包含了各种气象要素和参数的观测值&#xff0c;如温度、湿度、风速、降水量、气压等。 天气气象数据通常由气象站点、卫星观测和气象雷达等设备获取。这些设备会定期测量和记录各种气象要素&#xff0c;并将数据传输…

怎么虚化图片?虚化图片的软件分享!​

虚化图片是一种广泛应用于摄影和设计领域的技术。它可以通过柔化图像的某些部分&#xff0c;使图片更加优美、柔和&#xff0c;使人们更加关注图像的主体&#xff0c;强调出图片的重点。虚化图片的使用场景非常广泛。它可以用于制作海报、广告、杂志等印刷媒体&#xff0c;也可…

编译、安装、调试Linux内核

这里写目录标题 编译安装内核下载内核安装依赖更改.config编译内核安装首先安装模块安装内核更改引导更改grub重启 其他操作清理内核源目录卸载安装的内核修改内核配置菜单实现对新加入内核源码的控制 常见问题1. Module.symvers is missing2. No rule to make target ‘debian…

Redux的讲解与教程

我们在学习和使用React做项目的时候&#xff0c;肯定离不开Redux的使用。那么 “Redux” 是什么呢&#xff1f;。它有什么作用&#xff1f;它帮助我解决什么问题&#xff1f;我为什么要使用它&#xff1f;搞懂这些能让我们更好的理解和使用Redux。 Redux 是什么&#xff1f; R…

setjmp和longjmp

使用这两个函数时&#xff0c;一定要牢记&#xff0c; longjmp函数是有去无回的&#xff0c;后面还有两个错误的使用示例。 #include <setjmp.h> int setjmp(jmp_buf env); void longjmp(jmp_buf env, int val); 基础例子&#xff1a; #include <setjmp.h> #inc…

XHbuilder 需要的 ipa 签名,超详细的教程,你不看吃亏的是自己!

今天使用 hbuilder 运行到 ios 真机的时候&#xff0c;突然发现还需要 ipa 签名&#xff0c;这是什么东东呢&#xff1f; 1、IPA 签名是什么&#xff1f; 因苹果公司禁止企业证书用于非企业内部开发者。所以开发者无法再使用DCloud的企业证书签名的标准运行基座。 运行标准基…

预约直播 | 展心展力MetaApp:基于DeepRec的稀疏模型训练实践

MetaApp-推荐广告研发部&#xff0c;主要负责 MetaApp 拳头产品 233 乐园的首页信息流的推荐和广告系统&#xff0c;是比较传统的推广搜组。本次议题介绍了 MetaApp-推荐广告研发部 从传统的TensorFlow&#xff08;cpu&#xff09;自研分布式ps方案&#xff0c;逐步迁移到使用…

智能安全配电装置伙房食堂中的应用

【摘要】伙房食堂是高频用火用电场所&#xff0c;用火用电设备集中&#xff0c;同时人流量密集&#xff0c;如果没有做好预防工作&#xff0c;则容易引发火灾&#xff0c;造成人员伤亡。智能安全配电装置作为一种安全配电产品&#xff0c;可以有效预防电气事故的发生&#xff0…

HttpRunner_参数化进阶

目录 一.获取返回包数据 二.调用其他接口返回值 三.yml文件 四.设置全局变量并引用 五.调用函数 六.参数化驱动(最简单的方式) 七.参数化驱动(复杂的方式)   八.使用指定的报告模板指定报告生成路径 九.保存测试过程数据 十.单独使用HttpRunner 一.获取返回包数据 …

QCN6274 QCN9274 What is the difference?|WIFI7 Solution|Wallys

QCN6274 QCN9274 What is the difference?|WIFI7 Solution|Wallys Q:QCN6274 QCN9274 What is the difference? A:The QCN6274 is a Qualcomm WiFi 7 chip, and Wallys is currently in the process of developing a WiFi module integrated with the QCN9274 chip. Its imp…

Pytorch实现多GPU并行训练(DDP)

Pytorch实现并行训练通常有两个接口&#xff1a;DP&#xff08;DataParallel&#xff09;和DDP&#xff08;DistributedDataParallel&#xff09;。目前DP&#xff08;DataParallel&#xff09;已经被Pytorch官方deprecate掉了&#xff0c;原因有二&#xff1a;1&#xff0c;DP…

浅聊Android性能优化~

作者&#xff1a;一只修仙的猿 前言 关于性能优化&#xff0c;可能我们的第一反应是这是高手做的事情&#xff0c;一直以来我也是这样认为的。但在最近一段时间&#xff0c;在公司项目上做了一些框架的性能优化&#xff0c;让我初步掀开了性能优化的面纱&#xff0c;也对他有了…

VirtualBox 部署 KVM 虚拟化

什么是KVM技术&#xff1f; KVM&#xff08;Kernel-based Virtual Machine&#xff09;是一种开源的虚拟化技术&#xff0c;它是Linux内核的一部分。KVM通过将Linux内核转换为Hypervisor&#xff0c;允许在同一物理主机上运行多个虚拟机实例&#xff0c;每个实例可以独享一部分…

JAVA学习之String学习

1.底层是用什么实现的&#xff1f; JDK8用的char数组&#xff0c;JDK9开始使用byte数组,而且都是final型&#xff0c;所以不同字符串&#xff08;值&#xff09;的地址必然不同。 char和byte的区别&#xff1a;char是2个字节表示&#xff0c;而byte是一个字节。 JDK17中&…

Vue3解决:[Vue warn]: Failed to resolve component: el-table(或el-button) 的三种解决方案

1、问题描述&#xff1a; 其一、报错为&#xff1a; [Vue warn]: Failed to resolve component: el-table If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement. at <App> 或者&#xff1a; …

网络安全(黑客)自学

建议一&#xff1a;黑客七个等级 黑客&#xff0c;对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域&#xff0c;越深入越敬畏&#xff0c;知识如海洋&#xff0c;黑客也存在一些等级&#xff0c;参考知道创宇 CEO ic&#xff08;世界顶级黑客团队 0x557 成员&…

kubectl-ai:K8S资源清单的GPT助手

琦彦&#xff0c;在 **云原生百宝箱 **公众号等你&#xff0c;与你一起探讨应用迁移&#xff0c;GitOps&#xff0c;二次开发&#xff0c;解决方案&#xff0c;CNCF生态&#xff0c;及生活况味。 kubectl-ai 项目是一个kubectl使用 OpenAI GPT 生成和应用 Kubernetes 清单的插件…

【APP自动化测试必知必会】Appium之微信小程序自动化测试

本节大纲 H5 与小程序介绍 混合 App 元素定位环境部署 混合 App 元素操作 Airtest 测试 App 01.H5与小程序介绍 H5概述 H5 是指第 5 代 HTML &#xff0c;也指用 H5 语言制作的一切数字产品。 所谓 HTML 是“超文本标记语言”的英文缩写。我们上网所看到网页&#xf…