标签:style blog http color 使用 strong
就像大家更熟悉的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;} |
标签:style blog http color 使用 strong
原文地址:http://www.cnblogs.com/kb342/p/3849781.html