mutable
该关键字可让const函数内允许修改变量,在非const函数中,表现和普通变量一致。
因为标记const的函数不可修改变量,因此为了某些特殊情况例如缓存变量且缓存值会修改,mutable出现了。
#include <iostream>
using namespace std;
class Test {
private:
mutable int mutableCount; // mutable 成员
public:
Test() : mutableCount(0) {}
// const 成员函数
void increment() const {
mutableCount++; // 可以修改 mutable 成员
}
};
constexpr
constexpr是在编译时求值,类似常量。
const int size = 100;
constexpr int constexpr_size = 100;
void test() {
int arr1[size];
int arr2[constexpr_size];
}
但常量可能是编译期常量,也可能是运行时常量,并且会占用寄存器。
而constexpr不仅类型指定了,且始终是编译期常量(也可以用于常量表达式)。
对比宏,又有如下优势:
- 宏是全局的,无法设定外部命名空间,constexpr可以放在命名空间中
- 宏可以不指定类型,而constexpr定义时就会被指定类型
volatile
volatile 告诉编译器:这个变量可能会在程序控制之外被改变,因此编译器不应该对这个变量进行激进的优化。
void consumer(volatile bool& ready_flag) {
while (!ready_flag) { // 没有 volatile,编译器可能优化这个检查
// 等待
}
std::cout << "Data: " << shared_data << std::endl;
}
1044

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



