# cv 限定符
cv(const 与 volatile)类型限定符 | cppreference.com (opens new window)
cv 限定符是 const
和 volatile
的合称。
当对象最初被创建时,所用的 cv 限定符决定对象的常量性或易变性。
const
大家都懂,就是不能修改的常量 (constant),直接修改会编译报错,间接修改(如利用 const_cast<int&>
等手段)为未定义行为。还有一点,就是写为 const
之后,编译器会进行优化。
而 volatile
翻译过来是“易变”的,表明该变量可能通过软件甚至硬件方式变化。这会阻止编译器对这个变量进行任何优化,包括但不限于:不会将变量放到寄存器中;不会对 const volatile
变量当做 const
进行优化。(不过,CPU 仍可以将变量放入缓存中,因为缓存对程序员是透明的)
代码例子见 const_cast 部分。
# C99 的 const
const int n = 10;
int a[n];
上面的代码不能通过 C99 标准的 C 编译器(以及 C++ 编译器)。 因为 C99 对 const 的定义为只读的变量(而不是常量)。
# const 和 constexpr
C: #define ll long long
C++: 'const int k=5;'
const中可以有变量名,但constexpr的表达式中不能有变量(可以有常量),因为:
constexpr 在编译时进行初始化,const 在运行时初始化!
# 底层const 和顶层 const
不是很懂,感觉没用