c++ volatile的一些理解

发布时间:2023-07-20 15:30

含义

在这里,我们将了解 C++ 中 volatile 限定符的含义。volatile 限定符在我们声明变量时应用到它。它用于告诉编译器,该值可能随时更改。这些是 volatile 的一些属性。

volatile 关键字不能删除内存分配。

它不能缓存寄存器中的变量。
该值不能按分配顺序更改。
让我们看看如何使用 volatile 关键字。
volatile int a;
int volatile a;

这里这两个声明是正确的。像其他数据类型一样,我们可以使用 volatile 指针、结构体、联合体等。 volatile 结构体和联合体本身可以是 volatile,它们的成员变量也可以是 volatile 类型。

volatile 用在不同的地方。对于内存映射的外设寄存器,一些全局变量,由一些其他函数或中断服务程序访问,或者在一些多线程应用程序中,可以使用 volatile。
例子

int main (){
   int value;
   value++;
}
int main (){
   volatile int value;
   value++;
}

有两个代码块。在第一个块中,不存在 volatile 关键字。因此对于第一种情况,变量将从内存复制到 CPU 寄存器,然后执行操作。在第二种情况下,存在volatile,所以在这种情况下,变量不会从内存复制到寄存器。

考虑下面的代码

int some_int = 100;
while(some_int == 100)
{
   //your code
}

当这个程序被编译时,编译器可能会优化这个代码,如果它发现程序从来没有尝试改变some_int的值,所以它可能会试图通过将循环从更改为等价的东西来优化while循环执行可能很快(因为循环中的条件似乎总是一样的)。(如果编译器不对其进行优化,那么它必须在每次迭代中获取 100 的值并将其与 100 进行比较,这显然有点慢。)while(some_int == 100) while(true) while true some_int

但是,有时,(程序的某些部分的)优化可能是不可取的,因为可能是其他人正在some_int从程序外部更改编译器不知道的值,因为它看不到它;但这就是你设计它的方式。在这种情况下,编译器的优化不会产生预期的结果!

因此,为了确保获得所需的结果,您需要以某种方式阻止编译器优化while循环。这就是volatile关键字发挥作用的地方。你需要做的就是这个,

volatile int some_int = 100; //note the \'volatile\' qualifier now!

换句话说,我将解释如下:

volatile告诉编译器:“嘿,编译器,我是易变的,你知道,我可以被一些你甚至不知道的 XYZ 改变。那个 XYZ 可以是任何东西。也许是这个星球之外的某个外星人,叫做程序。也许是闪电,某种形式中断,火山等可以使我变异。也许。你永远不知道谁会改变我!所以你这个无知的人,不要再扮演一个无所不知的上帝了,不要在我所在的地方触碰代码。好吧?”

总结

将一个变量用volatile修饰将会告诉编译器不要随便优化这个东西,并且将这个变量存储在内存中,而不是寄存器中。在多线程情况下,有可能这个变量在更改,而编译器优化之后不能及时发现这个变量其实已经改变了。
希望大家看完我的文章有所收获,如果大家发现有错误可以在评论区指出,共勉
\"c++

\0\0\0\0

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号