zoukankan      html  css  js  c++  java
  • 【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
    

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

  • 相关阅读:
    206. 反转链表
    JAVA 排序总结
    Codeforces Round #674 (Div. 3)
    【BM模板】
    【 lca 】最近公共祖先
    【 欧拉函数 】GCD
    【 裴蜀定理 】Border
    【调和级数 && 欧拉常数】 Harmonic Number
    【Lucas定理】组合数取模算法
    【 最短路 && 思维 】Escape Plan
  • 原文地址:https://www.cnblogs.com/lcgbk/p/14502076.html
Copyright © 2011-2022 走看看