volatile用法

一个定义为volatile的变量是说,这个变量可能会被意想不到的改变,这样编译器就不会去假设这个变量的值。精确的说,优化器在用到这个变量时,必须每次都要小心的重新读取这个变量的值,而不是使用保存在寄存器里面的备份。

 

问题:
1- 一个参数既可以是const还可以是volatile吗?为什么?
解答:可以。例如:只读的状态寄存器,它是volatile的,因为这个寄存器状态可能会被意想不到的改变。它也是const的,因为程序不应该试图去修改它。

 

2- 一个指针可以是volatile吗?为什么?
解答:可以,但是这种情况不常见。例如:当一个中服务子程序修改一个指向buffer的指针时。

 

3- 下面的函数有什么错误?
int square(volatile int *ptr)
{
  return *ptr * *ptr;
}
解答:因为*ptr是指向一个volatile类型的参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
{
  int a, b;
  a = *ptr;
  b = *ptr;
  return a * b;
}
但是由于*ptr的值可能会被意想不到的改变,因此a和b的值可能是不同的。结果导致这段代码可能返回的值不是所期待的平方值。要想达到回复平方值的目的,代码可做如下修改:
long square(volatile int *ptr)
{
  int a;
  a = *ptr;
  return a * a;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值