【问题标题】:'static volatile' vs. 'static' vs. 'volatile' in CC中的“静态易失性”与“静态”与“易失性”
【发布时间】:2017-09-02 04:19:52
【问题描述】:

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

【问题讨论】:

  • 您可能需要引用C11 Standard (draft n1570) § 6.2.2 Linkages of identifiers,后跟§ 6.2.4 对象的存储持续时间§ 6.7.1 存储类说明符
  • 这些是关键字、数据类型和限定符。如果您单独理解它们,将帮助您理解它们的含义以及如何使用它们。可能适合你:)
  • @JohnBollinger 感谢您对我的问题的整体评价,即使它的结构不是很好。无论如何,已经超过 2 年了,我开始理解这些说明符。在我进入一个需要我将它们用作替代方式或必须使用它们的程序之前,我真的不会深入了解!我学到的主要思想是,通过更高级的代码,我可以学到新东西。
  • @DavidC.Rankin 感谢您的参考。

标签: c variables specifier


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    对于关键字staticvolatile,写得够多了……

    参见示例:

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

    【讨论】:

      【解决方案3】:

      静态

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

      易失性:

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

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

      静态易失性:

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

      【讨论】:

      • 这个问题被标记为“C”。 C 中的static 与类无关。
      • 类和静态有什么关系??这有点误导。
      猜你喜欢
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2013-11-08
      • 2013-11-13
      • 2019-11-19
      相关资源
      最近更新 更多