C++寄存器优化

来源:微信公众号「编程学习基地」

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 在内存中的值

*q = 200;

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

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

在这里插入图片描述

解决方案 volatile

上面这种优化肯定要不得,所以有一个关键字来解决这种不好的优化问题,那就是 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

这样就不会出现地址一样,数值不一样的情况了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeRoy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值