'static volatile' 对比 'static' 对比 'volatile' 在 C 中
'static volatile' vs. 'static' vs. 'volatile' in C
组合使用变量说明符 static volatile
有什么区别?或单独使用一个;像微控制器编程中的 static
或 volatile
?
对于关键字 static
和 volatile
已经写够了...
参见示例:
- 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
组合使用变量说明符 static volatile
有什么区别?或单独使用一个;像微控制器编程中的 static
或 volatile
?
对于关键字 static
和 volatile
已经写够了...
参见示例:
- 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