当前位置:网站首页>Volatile keyword

Volatile keyword

2022-07-06 22:31:00 It's Beichen not too PI acridine

volatile keyword

volatile Key words and const It is also a type modifier , The variable modified by it indicates that it can be changed by some unknown factors of the compiler , Like the operating system 、 Hardware or other threads . Encountered the variable declared by this keyword , The compiler no longer optimizes the code that accesses the variable , It can provide stable access to special addresses .

Let's take a look at the following example :

int i=10;
int j = i;		//(1) sentence 
int k = i;		//(2) sentence 

At this time, the compiler optimizes the code , Because in (1)、(2) In two statements ,i Not used as an lvalue . At this time, the compiler thinks i The value of has not changed , So in (1) Statement is fetched from memory i The value is assigned to j after , This value has not been lost , But in (2) Continue to use this value to k assignment . The compiler will not generate assembly code and fetch it from memory again i Value , This improves efficiency . But should pay attention to :(1)、(2) Between sentences i Not used as an lvalue .

Another example :

volatile	int i=10;
int j = i;					//(3) sentence 
int k = i;					//(4) sentence 

volatile The keyword tells the compiler i It can change at any time , Every time you use it, you must take it out of memory i Value , Therefore, the assembly code generated by the compiler will be restarted from i Read the data at the address of and put it in k in .

So it looks like , If i It is a register variable or represents a port data or shared data of multiple threads , It's easy to make mistakes , So volatile It can guarantee stable access to special addresses .

const volatile int i=10; Is there a problem with this line of code ? without , that i What is the attribute ?

Answer one : No problem , For example, read-only status registers . It is volatile, Because it can be changed unexpectedly ; It is const, Because the program should not try to modify it .volatile and const Not contradictory , But the scope of control is different , One is outside the program itself , The other is the program itself .

Answer two : That's all right. ,const and volatile These two type qualifiers are not contradictory .const Express ( Runtime ) Constant semantics : By const The modified object cannot be modified in its scope , The compiler is not interested in trying to modify directly const The expression of the object will cause compilation errors .volatile Express “ Changeable ”, That is, at run time, the object may be modified outside the control flow of the current program context ( For example, it is modified by other threads in multithreading ; The memory of the object may be randomly modified by multiple hardware devices ): By volatile Decorated object , The compiler will not optimize the operation of this object . An object can be simultaneously const and volatile modification , Indicates that this object embodies constant semantics , But at the same time, it may be modified unexpectedly by the program context of the current object .

原网站

版权声明
本文为[It's Beichen not too PI acridine]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207061439469223.html