就像大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。
1,作用
1 XBYTE[2]=0x56; 2 XBYTE[2]=0x57; 3 XBYTE[2]=0x58;
对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,则编译器会逐一的进行编译并产生相应的机器代码(产生四条代码).
2,几个例子
intsquare(volatileint*ptr)
{
return
*ptr**ptr;
}
intsquare(volatileint*ptr)
{
inta,b;
a=*ptr;
b=*ptr;
returna*b;
}
longsquare(volatileint*ptr)
{
inta;
a=*ptr;
returna*a;
}
1
|
volatileintvint; |
1
2
3
|
volatileinti=10; inta=i; //... |
1
|
intb=i; |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include<stdio.h> voidmain(intargc, char *argv[]) { inti=10; inta=i; printf ( "i=%d" ,a); //下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道 __asm { movdwordptr[ebp-4],20h } intb=i; printf ( "i=%d" ,b); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include<stdio.h> voidmain(intargc, char *argv[]) { volatileinti=10; inta=i; printf ( "i=%d" ,a); __asm { movdwordptr[ebp-4],20h } intb=i; printf ( "i=%d" ,b); } |
1
|
for (inti=0;i<100000;i++); |
1
|
for (volatileinti=0;i<100000;i++); |
1
2
3
4
5
6
7
8
9
10
11
|
staticinti=0; intmain( void ) { //... while (1) { if (i)dosomething(); } } /*Interruptserviceroutine.*/ voidISR_2( void ){i=1;} |
原文:http://www.cnblogs.com/kb342/p/3849781.html