【问题标题】:volatile variables in CC中的可变变量
【发布时间】:2014-12-07 02:35:04
【问题描述】:

如果我将 C 代码中的所有变量都声明为 volatile 会发生什么?

据我所知,如何实现 volatile 是特定于实现的,最重要的是编译器不能信任它可能拥有的变量的任何副本。因此,如果我将所有变量都声明为易失性,程序可能会更大并且运行速度更慢。

如果我这样做还有其他问题吗?

【问题讨论】:

  • 我知道volatile 的唯一缺点是您已经提到的:每次访问时重新读取值的额外周期。
  • 每次代码访问变量时,都必须获取原始值,不能使用寄存器副本。
  • 这不仅仅是重新加载。如果编译器发现程序中不需要分配给普通变量的值,它可以消除其计算不存在。对于volatile 变量,它不能这样做。
  • @5gon12eder 这是我不知道的。谢谢。

标签: c system


【解决方案1】:

如果您正在开发从控制寄存器读取标志或指向该位置的驱动程序,您应该关注。

其中一些寄存器具有特殊属性,例如通过读取它们来清除或设置其他标志。然后使用 volatile 只会破坏您的代码。

我认为将所有变量声明为 volatile 并不是一个好主意。其中两个原因已经给出:更大的代码和运行速度更慢。

比这更糟糕的是没有思考。您将是最后一名也是最后一名专业人士,他会查看某个地方并进行适当的编程以防止运行条件破坏您的代码。将 all 声明为 volatile 只会将此推迟到您将来无法跟踪的错误。

声明 volatile 为:

  • 共享变量
  • 通过编译器优化您的代码(对于旧的编译器......现在它们已经非常好,因为在优化时不允许出现错误......但无论如何都需要明确)
  • 多线程共享变量

【讨论】:

  • 许多这些类型的声明有些过时了;因为编译器会根据优化忽略它们。
  • 不是。它们在那里是因为它们被使用了。 C 大量用于嵌入式系统。根据可用的资源,你必须使用你所拥有的来充分利用你的硬件!如果您编写一个访问量很大的驱动程序,您将看到最终产品性能发生相当大的性能变化!
  • 是的,你是对的。我指的是一个初级 c 程序员的上下文,在一个 simple 桌面应用程序上工作。我现在明白我是如何误导的了。在许多情况下,显式声明是必要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 2011-07-22
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
相关资源
最近更新 更多