Loading

【C/C++】 C++寄存器优化

作者:李春港
出处:https://www.cnblogs.com/lcgbk/p/14502076.html

一、前言

在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
00556820
00556820
00556820

到这里你会发现:为什么怎么地址一样,但值却不一样呢?
我们就相当于和编译器约定好了,我们不会去修改 tmp 的值,这个时候编译器就会做一个优化,将 tmp 的值,放到寄存器里面,然后读取 tmp 时直接在寄存器里面读取,加快读取速度。

所以出现以上情况是因为:tmp 读取的是「寄存器」的值,p ,q读取的是「内存」的值。

三、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
00666820
00666820
00666820

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

posted @ 2021-03-08 20:40  李春港  阅读(240)  评论(0编辑  收藏  举报