C语言/C++ 基础知识
1.面试常问关键字
Tips:去背诵概念完全没有任何的意义,需要你能结合一些例子去记忆。
1. volatile
关键字
- 作用:告诉编译器该变量可能会被外部因素改变,禁止优化。 即告诉编译器每次存取该变量的时候都要从内存去存取而不是使用它之前在寄存器中的备份。
什么是编译器优化?
我们首先去理解CPU 的工作原理。CPU在执行程序的时候会将指令从内存中取出来,然后放到寄存器中执行。 寄存器是CPU内部的高速缓存,速度非常快。 编译器优化就是为了提高程序的执行效率,减少不必要的内存访问和计算。
例如,如果一个变量在程序中没有被修改,编译器可以将它的值缓存到寄存器中,而不是每次都从内存中读取。 所以我们就需要来讲一下内存读取规则。
int a, b;// 为a,b申请内存
a = 1; // 1 -> CPU
// CPU -> 内存(&a)
b = a; // 内存(&a) -> CPU
// CPU -> 内存(&b)
- 如代码所示,a = 1这个程序,先将1写入CPU,再从CPU中将1写入a所在的内存地址中;
- b = a是先从内存中将a的值取出到CPU,再从CPU将值存入b的内存地址中。
int a = 1 , b, c; // 为a,b,c申请内存并初始化
b = a; // 内存(&a) -> CPU
// CPU -> 内存(&b)
c = a; // * 内存(&a) -> CPU *
// CPU -> 内存(&c)
如上图代码所⽰,上边的程序如果按第⼀段代码所说的顺序执⾏,则c = a语句在编译时 是可以被编译器优化的,即注释部分(* 内存(&a) -> CPU *)的内容不被执⾏,因为在b = a这个语句中,a已经被移⼊过寄存器(CPU),那么在执⾏c = a时,就直接将a在寄存器 (CPU)中传递给c。这样就减少了⼀次指令的执⾏,就完成了优化。
上⾯就是编译器优化的原理过程,但是这个过程,有时会出现问题,⽽这个问题也就 volatile存在的意义!