我知道volatile关键字,
volatile int k=7;
Run Code Online (Sandbox Code Playgroud)
我们提示编译器可以随时更改变量但是简单
int k=7呢?我们可以随时更改它,因为它不是恒定的吗?有什么不同吗?
Ale*_*ler 18
volatile防止编译器优化并告诉编译器声明volatile的变量的内容可以随时改变(即硬件设备,中断或其他线程启动并写入变量的内存位置).这意味着,无法在CPU寄存器中缓存值.
volatile int a = foo();
d=a+4;
e=a+4;
f=a+4;
Run Code Online (Sandbox Code Playgroud)
这里,编译器a每次使用时都被迫从内存中读取.如果没有volatile,预计算a+4将是有效(和有效)的优化.
volatile int a = 4;
return a+5;
Run Code Online (Sandbox Code Playgroud)
这里,编译器不允许将其优化为简单,return 9;因为内容a可能在初始化(第1行)和第一次使用(第2行)之间发生变化;
它主要用于带有中断等的低级编程
volatile int count;
void test()
{
while(count< 100)
{
// do nothing
}
}
//
// Interrupt function called by the hardware automatically at intervals
//
void interrupt()
{
count = count + 1;
}
Run Code Online (Sandbox Code Playgroud)
如果您不将变量声明为 volatile,编译器可能会注意到 count 在 while 循环中无法更改,因此不会每次都从内存中实际读取该值,因此它永远不会退出循环。
如果您将其声明为易失性,那么编译器每次都会从内存中读取该值,因为您告诉它该值可能会更改,恕不另行通知......
另一个用途是映射硬件端口。
在微控制器上,您可能有一些数字输入“出现”在某个内存地址处。您可以将它们当作变量来读取,但当然,该值可能会根据输入信号而随时变化。将值声明为 易失性 将向编译器表明,是的,您实际上每次都需要读取此内存位置,因为它可能已更改,并且您不能假设它不会更改,除非您更改它。
除非您使用低级中断或线程的某些用途,否则您不需要使用它。
编辑:要明确的是,易失性不是用于标准 c++ 中的 thead 之间的同步,它只执行一部分必要的操作。我原来的帖子中的最后一句话可能会产生误导。我的帖子中有关硬件中断等的示例和内容是 volatile 的用途,它绝对不是用于线程的,甚至不要尝试将它用于线程。
我最初写了“线程的一些用途”,因为在某些平台上使用 volatile 可能就足够了。一般来说,这是一个坏建议,但如果您有一个核心,并且所有写入对所有“线程”都可见,那么它可能适合您。例如,在具有基于简单中断的线程切换系统的微控制器上,即使没有标准保证,它也可能“工作”。但不要这样做。一般来说,这是错误的,c++11 有实际有效的方法(记住这个答案是在 c++11 之前写的)
| 归档时间: |
|
| 查看次数: |
788 次 |
| 最近记录: |