【问题标题】:C++ const vs volatile [duplicate]C ++ const vs volatile [重复]
【发布时间】:2017-08-29 20:19:38
【问题描述】:

根据我在网上和 SO 上阅读的内容:

常量:

  • 告诉编译器该变量不能使用 程序指令。
  • 因此,编译器可以优化代码。

易失性:

  • 变量是常数,但可以从程序外部更改。
  • 告诉编译器每次都从内存中读取变量的值。
  • 告诉编译器不要对这个变量使用优化。

如果我的理解是正确的,那么 volatile 只是另一种 const。

那么,像下面这样的一行是什么意思?

const volatile char A = 'C';

【问题讨论】:

  • 另外,volatile 表示变量可以从其他来源更新,而不仅仅是从 CPU 更新(例如,微控制器中的外围寄存器可以从 GPIO 或其他任何东西更新),因此您需要读取它们指针为 volatile。
  • 变量是常数,但可以从程序外部更改。 不对。可以修改 volatile 变量。
  • @FrançoisAndrieux 一些编译器会将const 变量放入非易失性内存中,这样做可能会导致设备崩溃。
  • @FrançoisAndrieux 因此 MCU(例如)具有闪存和 RAM 存储器。 Flash 用于程序流和 ram 用于变量。如果您声明 const 变量,一些编译器(嗯,链接器)会将这个变量作为程序的一部分放入闪存区域而不是 RAM 存储器中。如果您使用&constVariable,您可能会从闪存空间获取地址。
  • @tilz0R 我想你相信我提倡​​允许修改 const 非易失性变量。可能是因为 non-constvolatile 之间的分隔不那么明显,可以被解读为非“const volatile”。我将删除我的评论以避免混淆,因为 NathanOliver 的信息相同。

标签: c++ constants volatile


【解决方案1】:

不,volatile 不是“另一种const”。 volatile 不是的意思是“变量是常数”。

否则,您的观点是准确的。所以,const volatile 的意思是:

  1. 阻止程序员在初始化后修改对象(这是const 部分)
  2. 外部机制仍可能修改其值,因此每次请求读取时都必须从“内存”中检索该值,而不是通过优化缓存(这是volatile 部分)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2015-12-28
    • 2021-02-14
    • 2012-01-07
    • 1970-01-01
    • 2011-06-13
    • 2012-08-20
    相关资源
    最近更新 更多