为什么"易变"寄生在C++中?

Ste*_*eve 22 c++ volatile

请考虑以下代码:

int main()                                                                      
{                                                                             
    int i;                                                                      
    volatile int* p = &i;                                                       
    int *v = p;                                                                 
    return 0;                                                                   
}
Run Code Online (Sandbox Code Playgroud)

这给出了一个错误g++:

$ g++ -o volatile volatile.cpp 
volatile.cpp: In function ‘int main()’:
volatile.cpp:6: error: invalid conversion from ‘volatile int*’ to ‘int*’
Run Code Online (Sandbox Code Playgroud)

我的意图是我想要p挥发性.但是,一旦我读过它的值p,我就不在乎访问v是不是易变的.为什么要求v声明为volatile?

这当然是假设的代码.在实际情况下,你可以想像,p指向一个内存位置,但在外部修改,我想v指向该位置p在时指出v = p,即使后来p被外部修改.因此p是不稳定的,但v事实并非如此.

顺便说一句,当我认为这是C和C++时,我对这种行为感兴趣,但在C中,这只会产生警告,而不是错误.

Mik*_*our 36

如果你的意思是指针应该是易失性的,而不是它指向的对象,那么将其声明为

int* volatile p;
Run Code Online (Sandbox Code Playgroud)

  • 这是你的答案,史蒂夫.我想补充一下这个建议:*总是在**之后编写const/volatile限定符**你想要限定什么.*这是写限定符**的唯一方法,因为你可以写'volatile int`当你需要一个易失整数时,你可以使用`int volatile`,但只有`int*volatile`会给你一个volatile*指针*. (7认同)

Joh*_*ing 14

在C++中,volatile关键字对您可以执行的操作应用相同类型的限制const.标准将此称为'常规/挥发性资格中的'cv-qualification'.Consts只能由consts使用,并且挥发性只能由挥发物使用.

另外,这可以帮助您编写多线程代码.不是通过使用一些编译器魔法使你的变量突然变成原子或类似的东西,而是强迫你只是以易变的方式对易失性数据进行操作.有关更多信息,请参阅此Alexandrescu文章.