C++寄存器优化

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

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

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

End

本文分享自微信公众号 - 编程学习基地(LearnBase),作者:DeRoy

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-03-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CUDA优化的冷知识19|constant和寄存器

    https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html 来阅读原文。

    GPUS Lady
  • 寄存器习题

    3)MOV AX,[1200H]   DS:[1200H]= 20000H+1200H=21200H->2AH

    week
  • 8086CPU的寄存器

    为了提高CPU的运算速度,减少访问存储器的存取操作,8086CPU内置了相应寄存器,用来暂存参加运算的操作数及运算的中间结果。指令通过寄存器实现对操作数的操作比...

    跋扈洋
  • 8086段寄存器

    8086的访问内存的时候:物理地址=段地址×16+偏移地址,这个段地址由段寄存器来提供。8086有4个段地址寄存器,分别是CS,DS,ES,SS。其中CS是最为...

    zy010101
  • C语言: ---gdb查看内存和寄存器内容

    gdb没有CodeWarrior强大,但是也提供了查看寄存器的命令: (gdb) info register r1 r1 0xbffff...

    用户3479834
  • 一个寄存器变化引起的变化

    昨天下载了最新的飞思卡尔基于Cortex M4核的kinetis kv4xMCU数据参考手册,发现跟之前用的对于I2C模块一个寄存器的描述有变动,正好最近有使...

    用户1605515
  • C++register寄存器变量 | 用register做声明

    一般情况下,C++中的变量的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到CPU中的运算器。经过运算器运算,如果需要存...

    小林C语言
  • STM32寄存器讲解

    原理讲解 芯片讲解 STM32F103芯片 我们看到的 STM32 芯片是已经封装好的成品,主要由内核和片上外设组成。若与电脑类比,内核与外设就如同电脑上的 C...

    跋扈洋
  • SCT89C52.3(寄存器封装)

    文章中充斥着大量的寄存器,简单的说下什么是寄存器:寄存器是内置于各个 IP 外设中,是一种用于配置外设功能的存储器,就是一种内存,并且有相对应的地址。

    云深无际

扫码关注云+社区

领取腾讯云代金券