volatile有好几个特性,让我们来验证一下
1.对声明为volatile的变量操作时,每次都会从内存中取值,而不会使用原先保存在寄存器中的值。
让我们看一下两个例子,一个例子是对不声明为volatile的变量操作,一个例子是对声明为volatile的变量操作。编译器为gcc version 4.8.4,平台为32位ubuntu14.04,开启了一级优化,即g++ -O1 -std=c++11。汇编部分只看有注释的部分就行了。
//非volatile版
#include<stdio.h>
#include<pthread.h>
#include<iostream>
int fun(int a){
int x;
scanf("%d",&x);
if(a > x)
return a;
else
return x;
}
int main(){
int a = 5; //声明为非volatile
int b = 10;
int c = 20;
int d;
scanf("%d",&c);
a = fun(c);
b = a + 1;
printf("%d,%d\n",b,d);
return 0;;
}
080485fd <_Z3funi>:
80485fd: 53 push