Const限定符:
属于标准C里的限定符,负责将变量、对象转换成一个字面值常量,值得注意的是,Const限定符只能在编译期间被确定为字面值常量,但是在运行阶段还是会为其分配内存而不是存在于代码段中,也就是经常说的立即数,所以我们可以通过指针间接寻址改变它的数值!
Const限定符属于编译器的管辖范围,只有在编译阶段编译器会检查是否有对Const限定符修饰的变量被尝试直面的改变,如果有会报错。
Const限定符修饰的变量必须初始化否则会报错!
列如:
const int test = 6; √
const int test; ×
并且初始化之后在编译器看来他就是一个字面值常量不可以被修改!
列如:
const int test = 6;
test = 2; ×
引入const修饰符的好处在于可以有效的防止存放一些不想被改变数据的变量被程序员不小心的改变!
在编写大工程时Const会显得尤为重要,大型工程会高达上万个变量,其中一些变量用来存放一些关键数据,不能被改变,但是往往大型工程是团队合作的,所以即使你知道这个变量不能被改变,但是你的合作伙伴不知道!
为什么不用宏代替?
答:有些数据会在运行期间获得,但是这些数据一旦获取了就不想被改变了,宏在预编译期间就会被替换删除!
以上是本人在开发过程中体验到的!
constexpr限定符:
constexpr是C++11标准语法里的一个修饰符!使用它的好处在于提高运行速度,且拥有const的功能,同时也是属于编译器的管辖范围!
为什么说它提升运行速度?
首先通过我预编译发现:
Const限定符修饰的变量,在被当做右值赋值操作时会被直接替换成字面值常量!
列如:
constexpr int test = 6; // constexpr与const一样需要初始化
int a = test;
预编译:
constexpr int test = 6; // constexpr与const一样需要初始化
int a = 6; //替换成了字面值
这样做的话提升了运行速度,因为省去了内存寻址等操作!
编译器可以在生成的表里找到该变量名与类型和对应的值,完成很轻松的替换工作!就例如宏一样!