C++寄存器优化

news2024/10/5 20:22:26

在C++里面有个有趣的现象,先看代码

#include<iostream>
using namespace std;
int main()
{
 int const tmp = 100; //定义常量tmp tmp不能修改
 int const* p = &tmp; //不能通过指针修改指向的值 
 int* const q = const_cast<int*>(p); //去常属性 可以通过指针修改指向的内容
 *q = 200;
 cout << tmp << " " << *p << " " << *q << endl; //打印变量的值
 cout << &tmp << endl << p << endl << q << endl; //打印变量地址
 return 0;
}
打印结果
100 200 200
0086F9D0
0086F9D0
0086F9D0

what? 什么,地址一样,打印结果不一样,不是应该一样的吗!!!

既然标题是 C++ 寄存器优化,那么就要从寄存器出发去考虑。

「当定义常量时」

int const tmp = 100; //定义常量tmp tmp不能修改

我们就相当于和编译器约定好了,我们不会去修改 tmp 的值,这个时候编译器就会做一个优化,将 tmp 的值,放到寄存器里面,然后读取 tmp 时直接在寄存器里面读取,加快读取速度。

这个时候我们有去常属性 const_cast ,通过变量 q 修改 tmp 在内存中的值

int* const q = const_cast<int*>(p); //去常属性 可以通过指针修改指向的内容
*q = 200;

在打印结果时,tmp 读取的是「寄存器」的值,p ,q读取的是「内存」的值

cout << tmp << " " << *p << " " << *q << endl; //打印变量的值

解决方案 volatile

上面这种优化肯定程序员所不愿意看到的,所以C++有一个关键字来解决这种不期望的优化问题,那就是 volatile ,英文翻译:「易变的; 无定性的」; 其实就是告诉编译器这个关键字修饰的变量不安全,你要到内存里面去操作,不要直接从寄存器取值。

volatile int const tmp2 = 100;
volatile int const* pm = &tmp2;   //不能通过指针修改指向的值 
int* const qm = const_cast<int*>(pm); //q本身只读  指向读写 
*qm = 200;
cout << tmp2 << " " << *pm << " " << *qm << endl;
cout << (void*)&tmp2 << endl << (void*)pm << endl << qm << endl;
打印结果:
200 200 200
007CFDDC
007CFDDC
007CFDDC

这样就不会出现地址一样,数值不一样的情况了,也是我们希望看到的结果。

 

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

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

相关文章

【C++11】C++11新增语法特性 右值引用/移动语义/完美转发

C11 右值引用 1 右值引用1.1 左值 、 右值1.2 左值引用 VS 右值引用1.3 谈谈C11引入右值引用的意义1.4 左值引用和右值引用的一些细节问题 2 移动语义3 完美转发4 总结 1 右值引用 1.1 左值 、 右值 在C中所有的值不是左值就是右值。左值是指表达式结束后依然存在的持久化对象…

【JavaSE】Java基础语法(二十二):包装类

文章目录 1. 基本类型包装类2. Integer类3. 自动拆箱和自动装箱4. int和String类型的相互转换 1. 基本类型包装类 基本类型包装类的作用 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据常用的操作之一&#xff1a;用于基本数据类型与字符串之间的…

Goby 漏洞更新|锐捷网络 NBR路由器 webgl.data 信息泄露漏洞

漏洞名称&#xff1a;锐捷网络 NBR路由器 webgl.data 信息泄露漏洞 English Name&#xff1a;Ruijie NBR Router webgl.data information CVSS core: 7.5 影响资产数&#xff1a;204290 漏洞描述&#xff1a; 锐捷网络NBR700G路由器是锐捷网络股份有限公司的一款无线路由设…

口碑超好的挂耳式耳机盘点,这几款蓝牙耳机值得一看!

运动已成为人们业余生活中不可缺少的组成部分&#xff0c;徒步、夜跑、骑行等运动项目受到越来越多的人的喜欢&#xff0c;运动与耳机的搭配也是当代年轻人喜爱的行为方式&#xff0c;在颠簸的运动项目中耳机的稳固性和舒适性是非常主要的&#xff0c;现在新推出的开放式耳机深…

Ps:移除工具

移除工具 Remove Tool是一款简单易用、功能强大的工具&#xff0c;可快速、轻松地清去除图片中的干扰元素或不需要的区域。 快捷键&#xff1a;J 就如同使用画笔工具一样&#xff0c;只要在不需要的对象上涂抹&#xff08;描边&#xff09;即可将其去除。 移动工具基于人工智能…

几号发工资就能看出公司的好坏?(文末附招聘岗位)

作为一名资深的职场搬砖人&#xff0c;不知道各位最近有没有跟我一样关注到这个话题 ​#发工资时间看公司#小编刚看到这个话题的第一印象&#xff0c;想的是发工资时间无非是公司实力的体现&#xff0c;工资发的越早证明这个公司的现金流越稳定强大。 打开评论区&#xff0c;不…

Linux——进程优先级

1.什么是优先级&#xff1f; 优先级和权限息息相关。权限的含义为能还是不能做这件事。而优先级则表示&#xff1a;你有权限去做&#xff0c;只不过是先去做还是后去做这件事罢了。 2.为什么会存在优先级&#xff1f; 优先级表明了狼多肉少的理念&#xff0c;举个例子&#xff…

Processing通过编程实现艺术设计_实现艺术和现实的交互---数据设计分析002

还记得这个生命的游戏,也是在这上面有 https://processing.org/ 官网是这个 使用Processing可以用编程的方式来创作艺术 Processing是一门开源编程语言,可以直接对用它来做艺术创作, 可以看一些它的作品 https://processing.org/examples/gameoflife.html 官网是这个,完…

作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)

gdb(GNU Debugger) 是一个用于调试 Linux 系统的软件工具。在学习 Linux 的过程中&#xff0c;gdb 的重要性不言而喻。以下是 gdb 在 Linux 学习者中的重要性的详细说明: 帮助理解 Linux 系统的运作方式:gdb 是一个强大的调试工具&#xff0c;可以帮助学习者深入了解 Linux 系统…

代码随想录算法训练营day53 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和 动态规划

代码随想录算法训练营day53 | 1143.最长公共子序列&#xff0c;1035.不相交的线&#xff0c;53. 最大子序和 动态规划 1143.最长公共子序列解法一&#xff1a;动态规划 1035.不相交的线解法一&#xff1a;动态规划 53. 最大子序和 动态规划解法一&#xff1a;动态规划解法二&am…

Python学习38:凯撒密码——解密

类型&#xff1a;字符串‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 描述‪‬‪…

【Netty】Netty 编码器(十三)

文章目录 前言一、MessageToByteEncoder 抽象类二、MessageToMessageEncoder 抽象类总结 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#xff09;Netty 架构设计&#xff08;二&#xff09;Netty Channel 概述&#xff08;三&#xff09;Netty ChannelHan…

notepad++查询指定内容并复制

背景说明 记录一下使用notepad进行文本内容查找以及替换的相关场景,简单记录方便后期查看,场景内容: 1.从指定的给出内容中筛选出所有的人员id集合 2.将每一行后面添加逗号 1.从指定的给出内容中筛选出所有的人员id集合 要求从指定的给出内容中筛选出所有的人员id集…

便携式明渠流量计的使用特点

便携式明渠流量计使用特点&#xff1a; 便携式明渠流量计使用特点&#xff0c;首先了解相关要求&#xff1a; 随着新标准JJG711-1990《明渠堰槽流量计试行检定规程》、HJ/T15-2019《超声波明渠污水流量计技术要求及检测方法》、HJ 354-2019《水污染源在线监测系统(CODCr、NH3-N…

Java开发 - 你不知道的JVM优化详解

前言 代码上的优化达到一定程度&#xff0c;再想提高系统的性能就很难了&#xff0c;这时候&#xff0c;优秀的程序猿往往会从JVM入手来进行系统的优化。但话说回来&#xff0c;JVM方面的优化也是比较危险的&#xff0c;如果单单从测试服务器来优化JVM是没有太大的意义的&…

制作PE工具盘

文章目录 前言一、什么是PE工具箱&#xff1f;二、制作WinPE工具箱例&#xff1a;制作ISO模式的PE工具箱 三、PE工具箱的典型应用1.清除Windows登陆密码2.调整分区大小3.系统备份4.系统恢复例&#xff1a;系统备份与恢复 四、使用U深度制作的PE工具恢复误删除的文件实验步骤注意…

springboot+vue车辆充电桩管理系统(java项目源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的车辆充电桩管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;…

Vim的使用

1.什么是Vim Vim是Linux下的一款代码编辑器&#xff0c;vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面。例如语法加亮&#xff0c;可视化操作不仅…

Javascript中常用方法

1.操作元素的类&#xff1a; 元素.classList.add(类名) 元素.classList.remove(类名) 元素.classList.toggle(类名) //切换类名 2.操作表单元素属性&#xff1a; 表单.value用户名 表单.typepassworddisabled checked selected 3.自定义属性&#xff1a; 定义&#xff1a…

小程序极速注册认证免300认证费 突破管理员身份只能绑定5个小程序绿色通道

小程序注册账号管理相信大家有时候头都很大&#xff0c;一个身份证号只能绑定5个小程序主管理员。超个5个小程序就得请朋友、请亲戚身份证绑定管理员。有时还得看对方不方便&#xff0c;改个类目改个LOGO都还得管理员扫码。为了满足会员需求同是也满足自己需要&#xff0c;特别…