volatile关键字

volatile修饰形参:易变变量。
告诉编译器:这个变量可能会被未知的因素改变,不应该对这个变量进行优化。当这个变量数值被改变的时候,应该立刻把他写到内存中;读取这个变量的时候,不要使用备份数据,直接到内存中读取。

使用场合:

  • 多进程,多线程,共享的数据。
  • 并行设备的硬件寄存器(如:状态寄存器)
  • 一个中断服务子程序中使用的非自动变量(Non-automatic variables)。

深入:

  • 一个参数既可以是const还可以是volatile吗?解释为什么。
    可以,比如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
  • 一个指针可以是volatile 吗?解释为什么。
    可以。尽管这并不很常见。比如当一个中断服务子程序修改一个指向一个buffer的指针时。
  • 下面的函数有什么错误:
int square(volatile int *ptr)
{
    return *ptr * *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;
}

转载于:https://my.oschina.net/HappyTeemo/blog/1558433

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值