综合技术
直播中

李雪雅

7年用户 162经验值
私信 关注
[问答]

请问Volatile局部变量是在堆栈上分配的吗?

见到一个旧程序,在函数内部的局部变量加上了Volatile.
局部变量不是在堆栈上分配吗,每次调用函数,都会在堆栈上对局部变量重新分配栈内存空间吧.
这样的局部变量volatile有意义吗?
这个局部变是用一个全局变量给赋值的,然后在函数内部参与运算.
有人能分析一下吗

回帖(3)

高欢

2019-9-27 09:14:07
volatile只是告诉编译器,这个变量是挥发性的,每次<访问>必须<认认真真>的<读取-修改-写>到实际位置,而不能偷懒.
这不单单用在别的地方会修改的场合,还可以用于通知编译器不要优化某个变量.
比如
void delay(void)
{
    uint32 i = 0;
    for(i = 0; i < 100; i ++)
    {
    }
}
上面的i,在一些编译器,或者一些编译选项上,是可以被优化的,因为这个i没有输出操作,编译器为了提高运行速度把整个循环删掉是符合规定的,但这不是我们需要的结果.
如果声明成
    volatile uint32 i = 0;
编译器就不会优化这个变量,它不管是否外部是否<真的>会修改,都会乖乖的执行所有关于i的操作.
举报

黄颖

2019-9-27 09:19:38
谢谢,但我看到的应用没有这样的用法.而且,这样的For循环编译器会删除掉吗? 
应该是需要手工的设置一些优化选项吧,Default的编译器设置,应该不会被删掉.
举报

徐振方

2019-9-27 09:36:18
举例而已.
不同的编译器默认优化不一定是不优化,如Keil的默认优化是-O2,而不是-O0.
举报

更多回帖

发帖
×
20
完善资料,
赚取积分