【发布时间】: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-const和volatile之间的分隔不那么明显,可以被解读为非“const volatile”。我将删除我的评论以避免混淆,因为 NathanOliver 的信息相同。