'static volatile' 对比 'static' 对比 'volatile' 在 C 中

'static volatile' vs. 'static' vs. 'volatile' in C

组合使用变量说明符 static volatile 有什么区别?或单独使用一个;像微控制器编程中的 staticvolatile

对于关键字 staticvolatile 已经写够了...

参见示例:

  • Why is volatile needed in C?
  • What does "static" mean in C?

TWI接口的关注中,需要volatile,因为可以从不同的中断服务处理程序调用修改这些变量的函数。如果 volatile 被删除,编译器将优化代码,不知道代码可以被中断。这可能会导致失败。

static - 在这种情况下使变量仅在当前文件中可见

volatile - 编译器的信息是对象可以被正常执行路径之外的东西(例如,中断例程)更改,并保证变量将在任何使用前阅读并在每次更改后写入。 volatile(这是一个很常见的误解)不保证其他任何东西——没有原子性,没有缓存一致性等等,等等

静态:

静态变量是指在所有实例之间共享的 class 变量。

挥发性:

易失性变量是那些被读取和写入主存储器的变量。它们不存储在本地缓存中,总是从主内存中获取。

例如,两个线程使用 private volatile int x;。如果线程 A write(x) 和线程 B read(x) 那么,它将在不使用线程的本地缓存的情况下从主内存写入和读取这两次。

静态易失性:

即使静态变量是共享变量,但在不同的线程中,一个线程的本地缓存中的静态变量可以有不同的值。为了使其对所有线程保持一致,只需将其声明为 static volatile。所以每次它都会从主内存中获取。

这里提供了很多很好的答案,但没有提到范围。

静态变量一旦初始化并随后在范围内发生更改,它们将保留更改并且永远不会被销毁或再次初始化,尤其是在离开范围时。除非在代码中规定,否则不会。可以说,静态变量在生命周期方面类似于全局变量,但只能在其自身范围内访问。

volatile 部分倾向于强制执行从 RAM 中获取变量,而不是寄存器或闪存中的缓存副本。例如,假设某个代码在特定级别的优化设置下提交给编译器。编译器不假定变量附加任何其他条件,除非在变量未使用或超出其范围时将其清除。 volatile 本质上有双重用途,要么忽略编译器为该变量提供的优化,要么避免使用该变量的预取副本,RAM 中的副本除外。

静态 volatile 是两种行为的结合,该变量在 RAM 中的持久性超出了任何优化。

潜在的应用领域:

  • 闪存编程
  • 循环缓冲区
  • 环形缓冲区
  • 并发和multiprocessing/multithreading