文章

关键字 Cv限定符

关键字 Cv限定符

[TOC]

1. cv-限定符

cv表示constvolatile1

2. const

关键字const表示,内存被初始化以后,程序便不能再对它进行修改。1

具体介绍可以参考文章2

3. volatile

volatile 表明,即使程序代码没有对内存单元进行修改,其值也可能发生变化1

通常,编译器会对代码进行优化以提高效率,比如通过将变量值缓存到寄存器中来避免频繁地读写内存。而关键字volatile 可以告诉编译器 对象的值可能会以编译器不可预知的方式被改变。这个关键字阻止编译器对代码进行某些形式的优化,特别是与该变量相关的优化。3

有些变量可能被程序以外的因素所修改

  • 硬件或外部设备的状态寄存器。
  • 多线程应用中由另一个线程修改的变量。
  • 由操作系统的信号处理器或其他异步事件修改的变量。

在这些情况下,volatile 告诉编译器每次访问这个变量时都必须从它所在的内存读取它的值,而不能使用可能已经过时的缓存值。这确保了程序能够观察到这个变量的最新值。

下面是一个使用 volatile 的例子:

1
2
3
4
5
6
7
8
9
10
11
12
volatile int flag = 0;

void interrupt_handler() {
    flag = 1;
}

void main_loop() {
    while (flag == 0) {
        // 主循环逻辑
    }
    // 当中断处理函数将 flag 设置为 1 时,退出循环
}

在上面的代码中,flag 变量被标记为 volatile,因为它可能在 main_loop 函数执行过程中由中断处理函数 interrupt_handler 改变。

需要注意的是,volatile 并不意味着变量的访问是原子的,也不意味着变量的读写是线程安全的。此外,在某些多线程场景下,仅仅使用 volatile 是不够的,可能还需要使用互斥锁或原子操作来确保数据一致性和线程安全。

4. mutalbe

关键字mutalbe与cv-限定符相关,因此也放到这里。

mutalbe表示,即使结构(或类)变量为const,其某个成员也可以被修改。1

1
2
3
4
5
6
7
8
struct data
{
    char name[30];
    mutable int accesses;
};
const data veep = { "demo", 0 };
strcpy(veep.name, "New Name");    // 不合法
veep.accesses++;                  // 合法

参考文章456

本文由作者按照 CC BY 4.0 进行授权