C中的“静态易失性”与“静态”对比“易失性”

R1S*_*S8K 1 c variables specifier

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

P__*_*J__ 9

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

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


小智 8

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

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

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

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

潜在的应用领域:

  • 闪存编程
  • 循环缓冲区
  • 环形缓冲区
  • 并发和多处理/多线程


Aka*_*ore 6

静止的

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

易挥发的:

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

例如,两个线程使用,例如,private volatile int x;. 如果线程 A write(x) 和线程 B read(x),则两次都会从主内存写入和读取,而不使用线程的本地缓存。

静态易失性:

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

  • 这个问题被标记为“C”。C 中的“static”与类无关。 (7认同)