c++中可变与不稳定的深入理解

  

  

c++中修饰数据可变的关键字有三个:常量,挥发性和mutable.const比较好理解,表示其修饰的内容不可改变(至少编译期不可改变),而挥发性和可变恰好相反,指示数据总是可变的.mutable和挥发性均可以和const搭配使用,但两者在使用上有比较大差别。

  

下面话不多说了,来一起看看详细的介绍吧

  


  

  

可变只能作用在类成员上,指示其数据总是可变的。不能和const同时修饰一个成员,但能配合使用:const修饰的方法中,可变修饰的成员数据可以发生改变,除此之外不应该对类/对象带来副作用。

  

考虑一个可变的使用场景:呼叫系统中存有司机(司机)的信息,为了保护司机的隐私,司机对外展现的联系号码每隔五分钟从空闲号码池更新一次。根据需求,驱动程序类的实现如下伪代码:

        类驱动{   私人:   …//真实的电话号码   字符串的电话;//显示电话号码   可变的字符串displayPhone;      公众:   常量字符串getDisplayPhone () {   如果(needUpdate ()) {   lock.lock ();   如果(needUpdate ()) {   updateDisplayPhone ();//displayPhone在这里被改变   }   lock.unlock ();   }   返回displayPhone;   }   };      

在上述代码中,const方法中不允许对常规成员进行变动,但可变的成员不受此限制。对驱动程序类来说,其固有属性(姓名,年龄,真实手机号等)未发生改变,符合const修饰.mutable让一些随时可变的展示属性能发生改变,达到了灵活编程的目的。

  


  

  

挥发性用于修饰成员或变量,指示其修饰对象可能随时变化,编译器不要对所修饰变量进行优化(缓存),每次取值应该直接读取内存。由于不稳定的变化来自运行期,其可以与常量一起使用。两者一起使用可能让人费解,如果考虑场景就容易许多:CPU和GPU通过映射公用内存中的同一块,GPU可能随时往共享内存中写数据。对CPU上的程序来说,const修饰变量一直是右值,所以编译通过。但其变量内存中的值在运行期间可能随时在改变,挥发性修饰是正确做法。

  

在多线程环境下,挥发性可用作内存同步手段,例如多线程爆破密码:

        挥发性bool发现=false;      空运行(string目标){   而(!){//计算字典口令的哈希   如果目标==哈希){   发现=true;   打破;   }   }   }      

在动荡的修饰下,每次循环都会检查内存中的值,达到同步的效果。

  

需要注意的是,挥发性的值可能随时会变,期间会导致非预期的结果,例如下面的例子求平方和:

        双广场(挥发性双,挥发性双重b) {   返回(a + b) * (a + b);   }      

a和b都是随时可变的,所以上述代码中的第一个a + b可能和第二个不同,导致出现非预期的结果。这种情况下,正确做法是将值赋予常规变量,然后再相乘:

        双广场(挥发性双,挥发性双重b) {   双c=a + b;   返回c * c;   }      

<强>一般说来,挥发性用在如下的几个地方:
  

  

1。中断服务程序中修改的供其它程序检测的变量需要加波动;
  

  

2。多任务环境下各任务间共享的标志应该加波动;
  

  

3。存储器映射的硬件寄存器通常也要加波动说明,因为每次对它的读写都可能有不同意义。

  


  

  

可变只能用与类变量,不能与const同时使用;在const修饰的方法中,可变变量数值可以发生改变;
  挥发性只是运行期变量的值随时可能改变,这种改变即可能来自其他线程,也可能来自外部系统。
  

  

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

  

<强>参考
  

  https://en.cppreference.com/w/cpp/language/cv

  

下面是其他网友的补充

  

C/c++中波动的关键字和const对应,用来修饰变量,用于告诉编译器该变量值是不稳定的,可能被更改。使用挥发性注意事项:

  

(1)。编译器会对带有挥发性的关键字的变量禁用优化(挥发性说明符是一个编译器,一个对象可能暗示的方式改变它的值没有指定的语言,因此积极优化必须避免)。

c++中可变与不稳定的深入理解