关键字volatile
告知编译器变量可能被意外修改(如硬件寄存器、多线程共享变量),禁止编译器优化对该变量的访问,即编译器在优化的时候不能对该变量做某些假设,也不能为了提高速度将一个变量缓存到寄存器内而不写回。具体有:
- 当一个变量被多个线程共享,或者可能被硬件设备修改时,应该使用
volatile修饰,这样每次访问变量都会从内存中读取,而不是使用寄存器中的缓存值- 在嵌入式系统中,外设寄存器的状态可能会随时改变,这时候必须使用
volatile来声明指针,否则编译器优化可能导致程序无法正确读取外设最新的状态
示例:
volatile int flag = 0;
void interrupt_handler(){
flag=1;
}
int main(){
while(!flag){
//等待中断
}
//处理中断
}
上述代码中,若没有使用volatile修饰flag,编译器可能会优化while循环,认为flag在循环内部不会被修改,因此编译器就可能将flag的值缓存在寄存器中,从而导致循环无法退出。而加上volatile后,每次循环都会从内存中读取flag的最新值。
此外,需要注意的是,volatile并不能保证多线程之间的原子性,它只能确保每次访问都从内存读取或写入。如果需要原子操作,应该使用原子类型或互斥锁等机制。
原子操作(Atomic Operations):
指从其他线程的角度看,该操作要么完全执行完成,要么尚未开始,没有中间态
关键字const
定义不可修改的变量
示例:
const int a = 10;
a = 20;//编译报错,a是常量,不可赋值
在函数参数中使用const,可以 防止函数内部修改参数的值,特别是在传递指针或引用时。
示例:
void print(const char * ch){
ch[0] = 'A'; //错误,ch指向的内容是const
printf("%s",ch);
}
对于类的成员函数,const修饰符 表示该函数不会修改对象的成员变量
示例:
class MyClass{
public:
void nonConstFunc(){
x=10;//正确
}
void constFunc() const {
x=20;//错误,不能在const成员函数中修改成员变量
}
private:
int x;
//如果x被mutable修饰,则即使在const成员函数中也可以修改它:mutable int x;
};
const还可用于修饰返回类型,防止返回值被修改
示例:
//该函数被调用后,不能通过指针修改x的值
const int* getPointer(){
static int x=5;
return &x;
}
const的位置不同,其含义也有所不同:
1.指向常量的指针,指针可以改变,但指向的内容不可变
const int* p;
int const *p;
2.常量指针,指向的地址不可变,但内容可变
int* const p=&x;
3.指向常量的常量指针,地址和内容都不可变
const int* const p=&x;
关键字static
static在不同的上下文中有不同的作用
在函数内部的静态变量
void func(){
static int count=0;//只在第一次调用时初始化
count++;
printf("%d\n",count);
}
每次调用func()时,count的值均会保留上一次调用的结果,因为 它的生命周期是整个程序运行期间,而不是函数的栈帧。但是它的作用域仍然局限于函数内部,其他函数无法访问它。
在类中的静态成员变量
class MyClass{
public:
static int count;//声明静态成员变量
};
int MyClass::count=0;//定义并初始化
所有MyClass的实例共享同一个const变量,可以通过MyClass::count访问,也可以通过实例访问,但通常建议使用类名来访问。
静态成员函数
class MyClass{
static void staticFunc(){
//可以访问静态成员变量,但不能访问非静态成员
count++;
}
static int count;
};
静态成员函数没有this指针,因此不能访问类的非静态成员变量或非静态成员函数。
静态成员函数没有
this指针是因为它不依赖于对象实例,而是属于类本身,即静态成员函数是类级别的函数,而不是对象级别的函数。这种设计使得静态成员函数更适合执行与类相关但不需要对象状态的操作。
文件作用域内使用static
在文件作用域内(全局变量或函数)使用static,会 使得该变量或函数只在当前文件内可见,避免命名冲突。
file1.cpp
static int hiddenVar=1;//只在file1.cpp中可见
staic void hiddenFunc(){
//只在file1.cpp中可见
···
}
file2.cpp
extern int hiddenVar;//错误,无法访问file1.cpp中的hiddenVar
总结
| 关键字 | 核心作用 | 典型场景 |
|---|---|---|
| volatile | 禁止编译器优化,确保内存直接访问 | 硬件寄存器、多线程共享变量 |
| const | 定义不可修改的常量或参数 | 保护数据、接口约束 |
| static | 控制生命周期、作用域或共享性 | 局部持久化、类静态成员、文件封装 |
1397

被折叠的 条评论
为什么被折叠?



