zoukankan      html  css  js  c++  java
  • C++ volatile关键字

      volatile和const关键字一样,是一个类型修饰符,表示变量可以被编译器的某些未知因素修改,比如操作系统,硬件,某些线程等。遇到这个关键字声明的变量,编译器访问该变量的代码将不再进行优化,以提供对特殊地址的稳定访问。

      有代码如下:  

    int i = 10;
    int j = i;//语句1
    int k = i;//语句2

    这时候编译器进行代码优化,因为在语句1和语句2中,i不作为左值,编译器认为i的值没有发生变化,所以在语句1中将i的值取出赋给j之后i的值并未丢弃,而是在语句2中继续赋给k编译器不会产生汇编代码重新从i里面取值,这样做提高了效率,但是要注意,语句i要没有用作左值才行。而且编译器只在release模式下才对内存进行优化,在debug模式下volatile不会对内存进行优化。

      有代码如下:

        int i = 1;
        int j = i;
        int k = i;
        volatile int a = 10;
        volatile int b = a;
        volatile int c = a;

    debug模式下的汇编代码:

    int i = 1;
    010D17BE  mov         dword ptr [i],1  
        int j = i;
    010D17C5  mov         eax,dword ptr [i]  
    010D17C8  mov         dword ptr [j],eax  
        int k = i;
    010D17CB  mov         eax,dword ptr [i]  
    010D17CE  mov         dword ptr [k],eax  
        volatile int a = 10;
    010D17D1  mov         dword ptr [a],0Ah  
        volatile int b = a;
    010D17D8  mov         eax,dword ptr [a]  
    010D17DB  mov         dword ptr [b],eax  
        volatile int c = a;
    010D17DE  mov         eax,dword ptr [a]  
    010D17E1  mov         dword ptr [c],eax  

    volatile变量和普通变量的汇编代码没有区别,可见在debug模式下编译器没有进行内存优化。

    release模式下汇编代码:

        int i = 1;
        int j = i;
        int k = i;
        volatile int a = 10;
    01011006  mov         dword ptr [a],0Ah  
        volatile int b = a;
    0101100D  mov         eax,dword ptr [a]  
    01011010  mov         dword ptr [c],eax  
        volatile int c = a;
    01011013  mov         ecx,dword ptr [a]  
    01011016  mov         dword ptr [c],ecx      
  • 相关阅读:
    Netflix Ribbon(负载均衡)介绍
    Annotation 注解
    框架设计的灵魂-反射
    idea maven java.lang.outofmemoryerror gc overhead limit exceeded
    洛谷P4427 [BJOI2018]求和
    洛谷P1196 [NOI2002]银河英雄传说
    CF191C Fools and Roads
    洛谷P2296 寻找道路
    洛谷P3389 【模板】高斯消元法
    洛谷P1351 联合权值
  • 原文地址:https://www.cnblogs.com/lzmfywz/p/3073394.html
Copyright © 2011-2022 走看看